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 eve
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
I had a similar problem.My Recyclerview contained one Textview, two EditTexts and one remove Button to remove the item from the Recyclerview. I am getting the data from both the Edittexts, from a model class using a button from my activity. Everything works well I just want to know what all optimizations I can make. Please give your suggestions in a detailed manner.
My Model Class:
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;
}
}
Above class holds the three Strings one is the titile and the two hold the edittext data.
My Adapter code:
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());
}
}
});
}
}
In the adapter I am using two arraylists rtyArray
and qtyArray
to hold the position of the Edittext data in the model class.
public ArrayList<Integer> getRTY() {
return rtyArray;
}
public ArrayList<Integer> getQTY(){
return qtyArray;
}
The above two functions return the positions of the Edittextdata
My Activity:
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();
In my case both the position holding arrays are always equal in size.
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;
}
}