【问题标题】:How to get Recyclerview item's value in Android?如何在 Android 中获取 Recyclerview 项目值?
【发布时间】:2016-06-09 18:39:05
【问题描述】:

Recyclerview 有 4 个项目,即; textView1、textView2、EditText1 和 Checkbox1。 Recyclerview 也有 24 行。 EditText 在初始阶段是不可见的,只有在用户选中相应的复选框时才可见。 EditText 只接受数字。

到目前为止,该应用程序运行良好。

现在我需要获取所有 EditTexts 的值并需要将其显示在另一个不在 Recyclerview 中的 Textview 上?

Recyclerview Screenshot- Output Link

代码示例。

ExamFragment.java

public class ExamFragment extends Fragment  {


    RecyclerView recyclerView;
    ExamFragmentAdapter adapter;
    ArrayList<tblChapters> datalistChapters = new ArrayList<>();
    TextView txtQcount,txtQCounttotal;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v= inflater.inflate(R.layout.fragment_exam, container, false);

        txtQCounttotal=(TextView) v.findViewById(R.id.txtQCounttotal);
        txtQcount=(TextView) v.findViewById(R.id.txtQCount);
        recyclerView=(RecyclerView)v.findViewById(R.id.recycler_view);
        conn = new ConnectionClass(); //connection initialisation
        datalistChapters = conn.getChaptersAndCount(modeid, subjectid);
        adapter = new ExamFragmentAdapter(datalistChapters, getActivity());
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);
        return v;
}

}

ExamFragmentAdapter.java

public class ExamFragmentAdapter extends RecyclerView.Adapter<ExamFragmentAdapter.MyViewHolder> {

    private LayoutInflater inflater;
    MyViewHolder holder;
    Context mContext;


    ArrayList<tblChapters> chapterList=new ArrayList<>();
    public ExamFragmentAdapter(ArrayList<tblChapters> chapterList, Context context) {
        inflater = LayoutInflater.from(context);
        this.chapterList = chapterList;
        mContext=context;

    }
    @Override
    public ExamFragmentAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.chapter_list_row, parent, false);
        holder = new MyViewHolder(view, new MyCustomEditTextListener());
        return holder;

    }

    @Override
    public void onBindViewHolder(final ExamFragmentAdapter.MyViewHolder holder, final int position) {
        holder.title.setTextColor(Color.BLACK);
        holder.slno.setTextColor(Color.BLACK);
        holder.noOfQst.setTextColor(Color.BLACK);
        holder.noOfQst.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
        holder.noOfQst.setGravity(Gravity.CENTER);
        holder.title.setText(chapterList.get(position).getTitle()); // Setting Chapter title
        holder.slno.setText(String.valueOf(position + 1)+"."); //Setting sl no

        holder._myCustomEditTextListener.updatePosition(position);

        holder.noOfQst.setText(chapterList.get(position).getNoofQstns()); //Setting no of qstn

        if (chapterList.get(position).isVisibled()) {
            holder.noOfQst.setVisibility(View.VISIBLE);
        } else {
            holder.noOfQst.setVisibility(View.INVISIBLE);
        }

        //in some cases, it will prevent unwanted situations
        holder.cbox.setOnCheckedChangeListener(null);

        //if true, your checkbox will be selected, else unselected
        holder.cbox.setChecked(chapterList.get(position).isSelected());

        holder.cbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                //set your object's last status
                chapterList.get(position).setSelected(isChecked);
                chapterList.get(position).setVisibled(isChecked);


                //if checkbox checked display EditText(No of qstns), else hide it.
                if (holder.cbox.isChecked()) {
                    holder.noOfQst.setVisibility(View.VISIBLE);
                    holder.noOfQst.requestFocus();
                    holder.noOfQst.setText("10");
                    chapterList.get(position).setNoofQstns(holder.noOfQst.getText().toString());
                  /*  txtQcount.setText("0");
                    if (txtQcount.getText().toString().equals("")) {
                        txtQcount.setText("0");
                    }
                    txtQcount.setText(Integer.valueOf(txtQcount.getText().toString())+Integer.parseInt(holder.noOfQst.getText().toString()));*/
                }
                else {
                    holder.noOfQst.setVisibility(View.INVISIBLE);
                    holder.noOfQst.setText(""); //remove entered value when uncheck
                    chapterList.get(position).setNoofQstns("");
                }
            }
        });

    }

    // we make TextWatcher to be aware of the position it currently works with
    // this way, once a new item is attached in onBindViewHolder, it will
    // update current position MyCustomEditTextListener, reference to which is kept by ViewHolder
    private class MyCustomEditTextListener implements TextWatcher

    {
        private int position;
        private String oldval;


        public void updatePosition(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            // no op
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

            chapterList.get(position).setNoofQstns(charSequence.toString());
            int j = i;
            j = i2;
            j = i3;
        }

        @Override
        public void afterTextChanged(Editable editable) {


        }
    }
    @Override
    public int getItemCount() {
        return chapterList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        CheckBox cbox;
        TextView slno;
        EditText noOfQst;
        public MyCustomEditTextListener _myCustomEditTextListener;
        public MyViewHolder(View itemView,MyCustomEditTextListener myCustomEditTextListener) {
            super(itemView);

            title = (TextView) itemView.findViewById(R.id.txtTitle);
            cbox = (CheckBox) itemView.findViewById(R.id.cboxChapter);
            slno = (TextView) itemView.findViewById(R.id.txtRowSlno);
            noOfQst = (EditText) itemView.findViewById(R.id.etNoOfQstns);

            this._myCustomEditTextListener = myCustomEditTextListener;

            try {
                if (noOfQst.getVisibility() == View.VISIBLE) {
                    holder.noOfQst.setVisibility(View.INVISIBLE);
                    //adding textchange listener to no of qstn(EditText)
                    noOfQst.addTextChangedListener(myCustomEditTextListener);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

【问题讨论】:

  • 实现一个文本更改监听器并调用一个带有位置和文本的方法。
  • 现在我需要获取所有 EditTexts 的值 为什么? ...如果我正确理解您的代码,您已经在模型类的基础列表中获得了值...迭代 chapterList 并收集数据
  • @selvin .....你是对的。我有 ArrayList(chapterList) ,其中包含适配器类中的所有数据。但我在片段类中需要这些数据。如何从 ExamFragment.java 中获取 editText 值?因为我需要在另一个不属于 recyclerview 或适配器类的 textview 中显示这个值。

标签: android android-recyclerview


【解决方案1】:

您可以为回收站视图适配器注册一个AdapterDataObserver。 对于适配器中的每一项更新(用户更新 EditText),适配器可以调用notifyItemChanged(int position, Object payload)。观察者将在其onItemRangeChanged (int positionStart, int itemCount, Object payload) 回调中接收有效负载,您可以在有效负载对象中传递您想要的任何内容,以便累积所有 EditTexts 的值。

您也可以通过calling unregisterAdapterDataObserver在您的Activity/Fragment onStop 中注销观察者

【讨论】:

  • 非常感谢。现在我可以从我的片段页面轻松获取所有 editText 的值..
  • @Mina Wissa 在上面看到了你的答案......我的第一个想法是在 Activity 的 onDestroy() 方法中取消注册观察者。在 Activity 的 onStop() 方法中注销有优势吗?
  • @AJW 我相信这样更好,因为当活动不可见时您不需要观察者,因此您可以在 onStop() 中将其删除。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2019-11-23
相关资源
最近更新 更多