How to get data from Edit Text in a RecyclerView?

34,565

Solution 1

You don't need to use so many lists, just create a class that will contain all the data of single item, there is no need for buttons, use just text change listener instead.

sample code

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;
    }
}

Solution 2

To do this there are two ways:-

1) Add save Button in each row of RecyclerView on this Button click (onClick)

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

2) Add onTextChangedListener to 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
   }
  });

Then in your MainActivity.java retrive data from sharedpreferences or database

Share:
34,565
D.Madu
Author by

D.Madu

Work as an Android developer and as a SAP ABAP developer at Ceat Sri Lanka.

Updated on July 09, 2022

Comments

  • D.Madu
    D.Madu almost 2 years

    I have recyclerview with edit text. Each row has a edit text. I am entering values in the edit text manually and after i enter values, I want to get those values in each and every row. I want to get those values to the main activity. There may be 10 to 20 rows in the recyclerview. I want to get all values in those edit texts.

    This is my Adapter

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

    This is how i tried to get values. But it is not working

    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;
        }
    
  • visionix visionix
    visionix visionix almost 8 years
    while using addTextChangedListener on each of the editTexts, the text will be in s CharSequence, this text will be saved in _retData structure as you can see. when you want to get the data from the adapter just call retrieveData function
  • D.Madu
    D.Madu almost 8 years
    no they are not edit text. Those you put addTextChangedListener, they are text view. **numPicker ** is the edit text.
  • visionix visionix
    visionix visionix almost 8 years
    so instead of holder.setItemQty.addTextChangedListener just do holder.numPicker.addTextChangedListener
  • D.Madu
    D.Madu almost 8 years
    thank you for the response. this helped me to go for a solution. so i accept this answer
  • Eldho Paul Konnanal
    Eldho Paul Konnanal over 5 years
    Thank you ,but for this to work we have to make few changes . _retData = new ArrayList<RetItem>(mDataset.length); // this doesnt initialse the retData array with an initial size , It only sets a maximum size for the array. An this will give an array index out of bounds exception So this is what we have to do _retData = new ArrayList<RetItem>(mData.size()); for (int i =0;i<mData.size();++i){ _retData.add(new RetItem("","")); }