如何从片段访问RecyclerView中的数据?

时间:2019-01-22 16:17:43

标签: android android-fragments android-recyclerview recycler-adapter

我知道,这个问题问了很多遍,但是在阅读了一些答案后我完全迷失了。我是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)如何从Fragment中的适配器访问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 :(得分:0)

1),例如,在Adapter中为您的字段创建吸气剂

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()));

     }
    }

然后在您的Fragment中,调用configDataloggerAdapter.getConfigDataloggerData(),您将获取数据。其他字段也一样

2)我还不了解那一部分