我有一个RecyclerView
,其中每行还有EditText
,允许用户输入值。
但是,当用户旋转屏幕时,值会重置为默认的空白值。
所以我想将值保存在List
或Map
中,以便我可以在还原时重新填充列表。
但是我不知道如何“迭代当前列表”并抓住EditTexts
并提取值。
答案 0 :(得分:3)
如果您采用以下RecyclerView.Adapter
实现,您会注意到一些事情。包含数据的List
为static
,这意味着它不会在方向更改时重置。我们在TextWatcher
添加EditText
以允许我们在修改值时更新值,并且我们通过向标记添加标记来跟踪位置视图。请注意,这是我的特殊方法,有很多方法可以解决这个问题。
public class SampleAdapter extends RecyclerView.Adapter{
private static List<String> mEditTextValues = new ArrayList<>();
public SampleAdapter(){
//Mocking content for the editText
for(int i=1;i<=10;i++){
mEditTextValues.add("I'm editText number "+i);
}
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new CustomViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.edittext,parent,false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
CustomViewHolder viewHolder = ((CustomViewHolder)holder);
viewHolder.mEditText.setTag(position);
viewHolder.mEditText.setText(mEditTextValues.get(position));
}
@Override
public int getItemCount() {
return mEditTextValues.size();
}
public class CustomViewHolder extends RecyclerView.ViewHolder{
private EditText mEditText;
public CustomViewHolder(View itemView) {
super(itemView);
mEditText = (EditText)itemView.findViewById(R.id.editText);
mEditText.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
public void afterTextChanged(Editable editable) {}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if(mEditText.getTag()!=null){
mEditTextValues.set((int)mEditText.getTag(),charSequence.toString());
}
}
});
}
}
}
(gif可能看起来像是重置了,因为它处于循环中,它不是)
答案 1 :(得分:0)
这是 RecyclerView
回收的问题。
只需覆盖这些功能:
@Override
public long getItemId(int position) {
return position;
}
@Override public int getItemViewType(int position) {
return position;
}