保存输入到 RecyclerView 的 EditText 中的值

问题描述 投票:0回答:3

我有一个

RecyclerView
,其中每行还有一个
EditText
,允许用户输入一个值。

但是,当用户旋转屏幕时,这些值将重置为其默认空白值。

所以我想将值保存在

List
Map
中,以便我可以在恢复时重新填充列表。

但是我不知道如何“迭代当前列表”并获取

EditTexts
并提取值。

android android-edittext android-recyclerview
3个回答
9
投票

如果您以以下

RecyclerView.Adapter
实现为例,您会注意到一些事情。包含数据的
List
static
意味着它不会在方向改变时重置。我们在
TextWatcher
中添加了
EditText
,以便我们可以在修改值时更新值,并且我们还通过向视图添加 tag 来跟踪位置。请注意,这是我的特殊方法,有很多方法可以解决这个问题。

演示

enter image description here

适配器

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
投票

这是

RecyclerView
回收的问题。 只需重写这些函数即可:

@Override
public long getItemId(int position) {
    return position;
} 

@Override public int getItemViewType(int position) {
    return position;
}

0
投票

简单地将其添加到适配器类中,以便在滚动到 recyclerview 时显示编辑文本数据

@Override
public int getItemViewType(int position) {
    return position;
}
© www.soinside.com 2019 - 2024. All rights reserved.