【问题标题】:How to get data from Edit Text in a RecyclerView?如何从 RecyclerView 中的编辑文本中获取数据?
【发布时间】:2016-09-02 22:53:18
【问题描述】:

我有带有编辑文本的 recyclerview。每行都有一个编辑文本。我在编辑文本中手动输入值,输入值后,我想在每一行中获取这些值。我想将这些值用于主要活动。 recyclerview 中可能有 10 到 20 行。我想获取那些编辑文本中的所有值。

这是我的适配器

public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {

    private List<String> itemsName, itemsQty, itemsPCode, itemPlant;
    private OnItemClickListener onItemClickListener;
    private LayoutInflater layoutInflater;

    public SelectItemAdapter(Context context, String[] mDataset) {
        layoutInflater = LayoutInflater.from(context);
        itemsName = new ArrayList<String>();
        itemsQty = new ArrayList<String>();
        itemsPCode = new ArrayList<String>();
        itemPlant = new ArrayList<String>();
        this.mDataset = mDataset;


    }


    @Override
    public SelectItemAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = layoutInflater.inflate(R.layout.custom_row_selected_item, parent, false);
        return new ItemHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(SelectItemAdapter.ItemHolder holder, final int position) {
        holder.setItemName(itemsName.get(position));
        holder.setItemQty(itemsQty.get(position));
        holder.setItemPCode(itemsPCode.get(position));
        holder.setItemPlant(itemPlant.get(position));

    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }


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

    public Object getItemName(int position) {
        return itemsName.get(position);
    }

    public Object getItemPCode(int position) {
        return itemsPCode.get(position);
    }

    public Object getItemPlant(int position) {
        return itemPlant.get(position);
    }


    public void setOnItemClickListener(OnItemClickListener listener) {
        onItemClickListener = listener;
    }

    public OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }


    public interface OnItemClickListener {
        public void onItemClick(ItemHolder item, int position);
    }

    public void add(int location, String iName, String iQty, String iPCode, String iPlant) {
        itemsName.add(location, iName);
        itemsQty.add(location, iQty);
        itemsPCode.add(location, iPCode);
        itemPlant.add(location, iPlant);
        notifyItemInserted(location);
    }

    public void remove(int location) {
        if (location >= itemsName.size())
            return;

        itemsName.remove(location);
        notifyItemRemoved(location);
    }

    public static class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private SelectItemAdapter parent;
        TextView textItemName, txtPCode, txtAvailableQty, txtTempQty, txtPlant;
        Button bRemove;
        EditText numPicker;

        public ItemHolder(View itemView, SelectItemAdapter parent) {
            super(itemView);
            this.parent = parent;
            textItemName = (TextView) itemView.findViewById(R.id.txtProductName);
            txtAvailableQty = (TextView) itemView.findViewById(R.id.txtAvailbleQty);
            txtPCode = (TextView) itemView.findViewById(R.id.txtPCode);
            txtPlant = (TextView) itemView.findViewById(R.id.txtPlant);
            bRemove = (Button) itemView.findViewById(R.id.bRemove);
            numPicker = (EditText) itemView.findViewById(R.id.numberPicker);
            bRemove.setOnClickListener(this);
        }

        public void setItemName(CharSequence name) {
            textItemName.setText(name);
        }

        public void setItemQty(CharSequence name) {
            txtAvailableQty.setText(name);
        }

        public void setItemPCode(CharSequence name) {
            txtPCode.setText(name);
        }

        public void setItemPlant(CharSequence name) {
            txtPlant.setText(name);
        }

        public String getQtyNumber() {
            return numPicker.getText().toString();
        }

        public CharSequence getItemName() {
            return textItemName.getText();
        }


        public CharSequence getItemPCode() {
            return txtPCode.getText();
        }

        @Override
        public void onClick(View v) {
            final OnItemClickListener listener = parent.getOnItemClickListener();
            if (listener != null) {
                listener.onItemClick(this, getPosition());
            }
        }
    }

}

这就是我尝试获取值的方式。但它不起作用

private String getNumPicNumber(int i) {
        if (myRecyclerView.findViewHolderForLayoutPosition(i) instanceof SelectItemAdapter.ItemHolder) {
            SelectItemAdapter.ItemHolder childHolder = (SelectItemAdapter.ItemHolder) myRecyclerView.findViewHolderForLayoutPosition(i);
            numberPickerNumber = childHolder.getQtyNumber();
        }
        return numberPickerNumber;
    }

【问题讨论】:

  • 如何处理 RecyclerView 中编辑文本的焦点?它不会失去对滚动的关注。

标签: android android-edittext android-recyclerview


【解决方案1】:

要做到这一点,有两种方法:-

1) 在 RecyclerView 的每一行添加保存按钮 在这个Button上点击(onClick)

 @Override
        public void onClick(View v) {
           String ans = holher.numPicker.getText().toString();
           // save ans to sharedpreferences or Database
        }

2) 将 onTextChangedListener 添加到 EditText

holher.mumPicker.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

   public void beforeTextChanged(CharSequence s, int start,
     int count, int after) {
   }

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
      String ans = holher.numPicker.getText().toString();
           // save ans to sharedpreferences or Database
   }
  });

然后在您的 MainActivity.java 中从 sharedpreferences 或数据库中检索数据

【讨论】:

    【解决方案2】:

    你不需要使用这么多列表,只需创建一个包含单个项目所有数据的类,不需要按钮,只需使用文本更改侦听器即可。

    示例代码

    public class RetItem
    {
        public String _itemName;
        public String _itemQty;
        public String _itemPcode;
        public String _itemPlant;
    }
    
    public class SelectItemAdapter extends RecyclerView.Adapter<SelectItemAdapter.ItemHolder> {
    
        private List<RetItem> _retData;
         public SelectItemAdapter(Context context, String[] mDataset) {
            layoutInflater = LayoutInflater.from(context);
            _retData = new ArrayList<RetItem>(mDataset.length);
            this.mDataset = mDataset;
        }
    
          @Override
        public void onBindViewHolder(SelectItemAdapter.ItemHolder holder, final int position) {
            holder.setItemName(itemsName.get(position));
            holder.setItemName.addTextChangedListener(new TextWatcher() {
    
               public void afterTextChanged(Editable s) {}
    
               public void beforeTextChanged(CharSequence s, int start,
                 int count, int after) {
               }
    
               public void onTextChanged(CharSequence s, int start, int before, int count) {
                 _retData.get(position)._itemName = s.toString();
               }
              });
    
            holder.setItemQty(itemsQty.get(position));
            holder.setItemQty.addTextChangedListener(new TextWatcher() {
    
               public void afterTextChanged(Editable s) {}
    
               public void beforeTextChanged(CharSequence s, int start,
                 int count, int after) {
               }
    
               public void onTextChanged(CharSequence s, int start, int before, int count) {
                 _retData.get(position)._itemQty = s.toString();
               }
              });
    
            holder.setItemPCode(itemsPCode.get(position));
            holder.setItemPCode.addTextChangedListener(new TextWatcher() {
    
               public void afterTextChanged(Editable s) {}
    
               public void beforeTextChanged(CharSequence s, int start,
                 int count, int after) {
               }
    
               public void onTextChanged(CharSequence s, int start, int before, int count) {
                 _retData.get(position)._itemPcode = s.toString();
               }
              });       
            holder.setItemPlant(itemPlant.get(position));
            holder.setItemPlant.addTextChangedListener(new TextWatcher() {
    
               public void afterTextChanged(Editable s) {}
    
               public void beforeTextChanged(CharSequence s, int start,
                 int count, int after) {
               }
    
               public void onTextChanged(CharSequence s, int start, int before, int count) {
                 _retData.get(position)._itemPlant = s.toString();
               }
              });
        }
    
        public List<RetItem> retrieveData()
        {
            return _retData;
        }
    }
    

    【讨论】:

    • 在每个editTexts上使用addTextChangedListener时,文本将在s CharSequence中,如您所见,该文本将保存在_retData结构中。当您想从适配器获取数据时,只需调用 retrieveData 函数
    • 不,它们不是编辑文本。那些你把addTextChangedListener,他们是文本视图。 **numPicker ** 是编辑文本。
    • 所以代替 holder.setItemQty.addTextChangedListener 只是做 holder.numPicker.addTextChangedListener
    • 感谢您的回复。这帮助我寻求解决方案。所以我接受这个答案
    • 谢谢您,但要使其正常工作,我们必须进行一些更改。 _retData = new ArrayList(mDataset.length); // 这不会用初始大小初始化 retData 数组,它只设置数组的最大大小。这将给出一个数组索引超出范围的异常所以这就是我们要做的 _retData = new ArrayList(mData.size()); for (int i =0;i
    【解决方案3】:

    我遇到了类似的问题。我的 Recyclerview 包含一个 Textview、两个 EditText 和一个删除按钮,用于从 Recyclerview 中删除项目。我正在使用我活动中的按钮从模型类中的两个 Edittexts 中获取数据。一切正常我只想知道我能做哪些优化。请详细给出您的建议。

    我的模型课:

    public class OrderGS {
      String names, rty,qty;
    
        public OrderGS(String name, String rty, String qty) {
            this.names = name;
            this.rty = rty;
            this.qty = qty;
        }
    
        public String getName() {
            return names;
        }
    
        public void setName(String names) {
            this.names = names;
        }
    
        public String getRty() {
            return rty;
        }
    
        public void setRty(String rty) {
            this.rty = rty;
        }
    
        public String getQty() {
            return qty;
        }
    
        public void setQty(String qty) {
            this.qty = qty;
        }
    }
    

    上面的类包含三个字符串,一个是标题,两个是编辑文本数据。

    我的适配器代码:

    class OOHolderI extends RecyclerView.ViewHolder{
    
            TextView title;
            EditText rty,qty;
            public OOHolderI(View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.text_order);
                rty = itemView.findViewById(R.id.editRTY);
                qty = itemView.findViewById(R.id.editQTY);
                itemView.findViewById(R.id.button_remove).setOnClickListener(v -> {
                   arrayList.remove(getAdapterPosition());
                   if(rtyArray.size()>0) {
                       rtyArray.remove(getAdapterPosition());
                       qtyArray.remove(getAdapterPosition());
                   }
                   notifyDataSetChanged();
               });
                rty.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) {
    
                    }
    
                    @Override
                    public void afterTextChanged(Editable s) {
                    arrayList.get(getAdapterPosition()).setRty(s.toString());
                    if(!rtyArray.contains(getAdapterPosition())){
                    rtyArray.add(getAdapterPosition());}
                    }
                });
                qty.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) {
    
                    }
    
                    @Override
                    public void afterTextChanged(Editable s) {
                        arrayList.get(getAdapterPosition()).setQty(s.toString());
                        if(!qtyArray.contains(getAdapterPosition())) {
                            qtyArray.add(getAdapterPosition());
                        }
                    }
    
                });
    
    
            }
    
    }
    

    在适配器中,我使用两个数组列表 rtyArrayqtyArray 来保存模型类中 Edittext 数据的位置。

    public ArrayList<Integer> getRTY() {
        return rtyArray;
    }
    public ArrayList<Integer> getQTY(){
        return qtyArray;
    } 
    

    以上两个函数返回Edittextdata的位置

    我的活动:

     findViewById(R.id.button_save).setOnClickListener(v -> {
                ArrayList<Integer> rtyArray = adapter.getRTY();
                ArrayList<Integer> qtyArray = adapter.getQTY();
                if(rtyArray.size()>0) {
                   for(Integer i: rtyArray){
                  //get data here like 
                  arrayListOfModel.get(i).getRty(); 
                  arrayListOfModel.get(qtyArray.get(i)).getQty();
                   }
                }
            });
            adapter.notifyDataSetChanged();
    

    在我的例子中,两个位置保持数组的大小总是相等的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      相关资源
      最近更新 更多