J'ai recyclerview avec le texte d'édition. Chaque ligne a un texte d'édition. Je saisis les valeurs dans le texte de saisie manuellement et après avoir saisi les valeurs, je veux obtenir ces valeurs dans chaque ligne. Je veux obtenir ces valeurs dans l'activité principale. Il peut y avoir 10 à 20 lignes dans la vue de recyclage. Je veux obtenir toutes les valeurs dans ces textes d'édition.
Ceci est mon adaptateur
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());
}
}
}
}
C'est comme ça que j'ai essayé d'obtenir des valeurs. Mais ça ne fonctionne pas
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;
}
Vous n'avez pas besoin d'utiliser autant de listes, il vous suffit de créer une classe qui contiendra toutes les données d'un seul élément. Vous n'aurez pas besoin de boutons. Utilisez simplement l'écouteur de modification de texte.
exemple de 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;
}
}
Pour ce faire, il y a deux façons: -
1) Ajoutez un bouton de sauvegarde dans chaque ligne de RecyclerView Sur ce clic de bouton (onClick)
@Override
public void onClick(View v) {
String ans = holher.numPicker.getText().toString();
// save ans to sharedpreferences or Database
}
2) Ajoutez 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
}
});
Puis dans votre MainActivity.Java récupérez les données à partir de préférences partagées ou de base de données
J'ai eu un problème similaire.Mon Recyclerview contenait un Textview, deux EditTexts et un remove pour supprimer l'élément de Recyclerview. Je reçois les données des deux éditions, d'une classe de modèle à l'aide d'un bouton de mon activité. Tout fonctionne bien, je veux juste savoir ce que toutes les optimisations que je peux faire. S'il vous plaît donner vos suggestions de manière détaillée.
Ma classe de modèles:
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;
}
}
Au-dessus de la classe contient les trois chaînes, l’un est le titile et les deux contiennent les données edittext.
Mon code d'adaptateur:
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());
}
}
});
}
}
Dans l'adaptateur, j'utilise deux arraylists rtyArray
et qtyArray
pour tenir la position des données Edittext dans la classe de modèle.
public ArrayList<Integer> getRTY() {
return rtyArray;
}
public ArrayList<Integer> getQTY(){
return qtyArray;
}
Les deux fonctions ci-dessus renvoient les positions de Edittextdata
Mon activité:
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();
Dans mon cas, les tableaux de maintien de position ont toujours la même taille.
Ajoutez EditTextListener dans RecyclerView Adapter et implémentez TextWatcher dans EditTextListener.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_edittext, parent, false);
// pass MyCustomEditTextListener to viewholder in onCreateViewHolder
// so that we don't have to do this expensive allocation in onBindViewHolder
ViewHolder vh = new ViewHolder(v, new MyCustomEditTextListener());
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// update MyCustomEditTextListener every time we bind a new item
// so that it knows what item in mDataset to update
holder.myCustomEditTextListener.updatePosition(holder.getAdapterPosition());
holder.mEditText.setText(mDataset[holder.getAdapterPosition()]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public EditText mEditText;
public MyCustomEditTextListener myCustomEditTextListener;
public ViewHolder(View v, MyCustomEditTextListener myCustomEditTextListener) {
super(v);
this.mEditText = (EditText) v.findViewById(R.id.editText);
this.myCustomEditTextListener = myCustomEditTextListener;
this.mEditText.addTextChangedListener(myCustomEditTextListener);
}
}
// 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;
public void updatePosition(int position) {
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
mDataset[position] = charSequence.toString();
}
@Override
public void afterTextChanged(Editable editable) {
}
}
}
Les valeurs seront sauvegardées dans un tableau de chaînes (mDataset)
Bonne codage.