Как получить доступ к данным в RecyclerView из фрагмента? - PullRequest
0 голосов
/ 22 января 2019

Я знаю, этот вопрос задавали много раз, но я полностью растерялся после прочтения некоторых ответов.Я новичок в разработке Android.Я создал фрагмент и инициализировал и установил адаптер из этого фрагмента

public void onActivityCreated(@Nullable Bundle savedInstanceState) {
 super.onActivityCreated(savedInstanceState);
 mViewModel = ViewModelProviders.of(this).get(ConfigDataloggerViewModel.class);
 dataLoggerList = getResources().getStringArray(R.array.DataLoggerStringArray);
 // TODO: Use the ViewModel
 //for (int j=0; j< dataLoggerList.length; j++){ DummyArrayList.add(dataLoggerList[j]);}
 RecyclerView recyclerView = getView().findViewById(R.id.config_datalogger_recycle_view);

 ConfigDataloggerAdapter configDataloggerAdapter = new ConfigDataloggerAdapter(dataLoggerList, getActivity());
 recyclerView.setAdapter(configDataloggerAdapter);
 recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

У меня есть список EditText в моем фрагменте, и я устанавливаю эти EditText в адаптере, и я также сохраняю значения из EditTexts вмассив, который определен в самом адаптере.

public class ConfigDataloggerAdapter extends RecyclerView.Adapter<ConfigDataloggerAdapter.ViewHolder>{
    //private ArrayList<RFIDReader> readers = new ArrayList<>();
    private String [] mDummyList ;
   // private ArrayList<String> mDummyArrayList = new ArrayList<>();
    public String [] mDummyArrayList;
    //public ArrayList<String> mConfigDataloggerData ;
    public  String[] mConfigDataloggerData;
   // private ConfigDataloggerViewModel mConfigDataModel;
    public Map<String, String> tempDataModel = new HashMap<>();

    private Context mContext;


    public ConfigDataloggerAdapter( String [] mDummyArrayList, Context mContext) {
        this.mDummyArrayList = mDummyArrayList;
        this.mContext = mContext;
        mConfigDataloggerData = new String[mDummyArrayList.length];


    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.config_datalogger_list,viewGroup,false);

        ConfigDataloggerAdapter.ViewHolder holder = new  ConfigDataloggerAdapter.ViewHolder(view);


        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull  ConfigDataloggerAdapter.ViewHolder holder, int i) {
        String [] mConfigDataloggerText = null;
       // for (int j=0; j< mDummyList.length; j++){ mDummyArrayList.add(mDummyList[j]);}
        //ReaderDevice readerDevice = mDummyArrayList.get(i);
        String temp = mDummyArrayList[i];
        holder.mConfigDataloggerListText.setText(temp);
       // tempDataModel.put(temp,mConfigDataloggerData.get(i) );
      // mConfigDataModel.setConfigDataloggerVMData(tempDataModel);




        //holder.reader_checkedTextView.setText(readerDevice.getName()  );
    }

    @Override
    public int getItemCount() {
        return mDummyArrayList.length;
    }

    public  class ViewHolder extends RecyclerView.ViewHolder{


        public TextView mConfigDataloggerListText;
        public EditText mConfigDataloggarListEditText;
        public LinearLayout configDataloggerLayout;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mConfigDataloggerListText = itemView.findViewById(R.id.textView_config_datalogger);
            mConfigDataloggarListEditText = itemView.findViewById(R.id.editText_config_datalogger);

            mConfigDataloggarListEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    mConfigDataloggerData[getAdapterPosition()] = 
                                     mConfigDataloggarListEditText.getText().toString();
                //here I am storing data from editText to the array

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });

            configDataloggerLayout = itemView.findViewById(R.id.config_datalogger_list_layout);

        }
    }


}

У меня есть два вопроса: 1) как получить доступ к mConfigDataloggerData из адаптера во фрагменте?2) У меня есть кнопка в том же фрагменте.когда я нажимаю кнопку, начинается другой фрагмент.Теперь я хочу сохранить данные из mConfigDataloggerData в ViewModel при нажатии кнопки.Так где именно я пишу mViewModel = ViewModelProviders.of(this).get(xxxx.class);?

Для справки ниже приведен код операции, к которой прикреплены мои фрагменты.

public class defaultActivity extends AppCompatActivity {

    private String TAG = "default activity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

         setContentView(R.layout.datalogger_activity);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ConfigDataloggerFragment configDataloggerFragment = new ConfigDataloggerFragment();

       // getSupportFragmentManager().beginTransaction().add(R.id.default_datalogger_activity, datalogger).commit();
        getSupportFragmentManager().beginTransaction().add(R.id.default_datalogger_activity, configDataloggerFragment).commit();

    }


    public void StartorStopInventory(View view) {

        Button button = (Button) view;
        if (application.mConnectedReader.isConnected()){
            if (application.mIsInventoryRunning ){
                application.mIsInventoryRunning = true;
                button.setText("STOP");
                try{
                    TriggerInfo triggerInfo = new TriggerInfo();
                    Log.d(TAG, "Start trigger setting when button is pressed" + triggerInfo.StartTrigger.getTriggerType());
                    Log.d(TAG, "Stop trigger setting when button is pressed" + triggerInfo.StartTrigger.getTriggerType());
                    application.mConnectedReader.Actions.Inventory.perform();
                }catch (InvalidUsageException e){
                    Log.d(TAG, "StartorStopInventory: Inventory perform fail " + e);
                } catch (final OperationFailureException op) {
                    op.printStackTrace();
                    Log.d(TAG, "StartorStopInventory: Operational failure " + op.getResults() + " " + op.getVendorMessage());
                    Toast.makeText(view.getContext(), op.getVendorMessage(), Toast.LENGTH_LONG);

                }
            }
        }
    }

    public void start_data_logging_click(View view) {
        Datalogger datalogger = new Datalogger();
       // getSupportFragmentManager().beginTransaction().replace(R.id.default_datalogger_activity, datalogger);
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.default_datalogger_activity, datalogger);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

1 Ответ

0 голосов
/ 22 января 2019

1) Создание геттеров в адаптере для ваших полей, например

public String[] getConfigDataloggerData(){
    return mConfigDataloggerData;
}
...

Чтобы объявить адаптер глобально;

   public class YourFragment {
      ConfigDataloggerAdapter configDataloggerAdapter,

   public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
     mViewModel = ViewModelProviders.of(this).get(ConfigDataloggerViewModel.class);
     dataLoggerList = getResources().getStringArray(R.array.DataLoggerStringArray);
     // TODO: Use the ViewModel
     //for (int j=0; j< dataLoggerList.length; j++){ DummyArrayList.add(dataLoggerList[j]);}
     RecyclerView recyclerView = getView().findViewById(R.id.config_datalogger_recycle_view);

      configDataloggerAdapter = new ConfigDataloggerAdapter(dataLoggerList, getActivity());
     recyclerView.setAdapter(configDataloggerAdapter);
     recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

     }
    }

Затем внутри своего фрагмента позвоните configDataloggerAdapter.getConfigDataloggerData(), и вы получите свои данные. То же самое для других полей

2) Я пока не понимаю эту часть

...