android - 如何从 Fragment 访问 RecyclerView 中的数据?

标签 android android-fragments android-recyclerview

我知道,这个问题被问过很多次,但在阅读了一些答案后我完全迷失了。我是 Android 开发的新手。我已经创建了一个 fragment 并从该 fragment 初始化并设置了适配器

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

我的 fragment 中有 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)我在同一个 fragment 中有一个按钮。当我按下按钮时,其他 fragment 开始。现在,我想在按下按钮时将数据从 mConfigDataloggerData 保存到 ViewModel。那么我到底在哪里写 mViewModel = ViewModelProviders.of(this).get(xxxx.class);

供您引用,下面的代码是我的 fragment 所附加的 Activity 。

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) 在 Adapter 中为您的字段创建 getter,例如

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)我还不明白那部分

关于android - 如何从 Fragment 访问 RecyclerView 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312361/

相关文章:

Android SDK 模拟器错误 : Broken AVD system path

java - 如何启动 RecentApplicationsDialog?

android - 如何更改android中的启动 Activity ?

java.lang.IllegalStateException : Fragment not attached to Activity issue in android

java - 安卓 : Using DatePicker from Fragment

android - OnItemClickListener 无法解析为类型(在 Fragment 内)

java - 如何根据类别实现带有节标题的 RecyclerView?

java - Android Recyclerview 的一些项目

android - RecyclerView Item Click Listener 与 DataBinding

php - Laravel 5 android 聊天与推送通知像 Whatsapp