我有带编辑文字的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;
}
答案 0 :(得分:10)
您不需要使用这么多列表,只需创建一个包含单个项目的所有数据的类,不需要按钮,而只使用文本更改侦听器。
示例代码
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;
}
}
答案 1 :(得分:2)
要做到这一点,有两种方法: -
1)在RecyclerView的每一行中添加保存按钮 在此按钮上单击(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 中从共享偏好或数据库中检索数据
答案 2 :(得分:0)
在RecyclerView Adapter中添加EditTextListener,并在EditTextListener中实现TextWatcher。
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) {
}
}
}
值将保存在String Array(mDataset)
中快乐编码。
答案 3 :(得分:0)
我遇到了类似的问题。我的Recyclerview包含一个Textview,两个EditTexts和一个删除按钮,以从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;
}
}
上面的类包含三个字符串,一个是titile,两个包含edittext数据。
我的适配器代码:
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());
}
}
});
}
}
在适配器中,我使用两个arraylists rtyArray
和qtyArray
来保存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();
在我的情况下,位置保持数组的大小总是相等。