处理RecyclerView中嵌套EditText数据显示混乱
2018-01-29 13:47
453 查看
在平常开发中 RecyclerView 我们是常用到的,因为它的回收复用机制会遇到过很多坑,比如嵌套 CheckBox 、RadioButton 、 EditText 等组件在滑动时会出现数据混乱问题。今天我们就来使用 EditText 写一个例子来处理这个问题吧。
private void initRecyclerView() { RecyclerView mRecyclerView = findViewById(R.id.rv_simple); SimpleAdapter simpleAdapter = new SimpleAdapter(); LinearLayoutManager layoutManager = new LinearLayoutManager(this); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(simpleAdapter); } private class SimpleAdapter extends RecyclerView.Adapter { /** * 显示条数 */ private final int mSimpleNum = 20; /** * ViewHolder 创建次数 */ private int mCreateTimes = 0; /** * ViewHolder 绑定次数 */ private int mBindTimes = 0; /** * 已经绑定文本变化监听器 */ private final boolean mBoundWatcher = true; /** * 输入框文本缓存 */ private SparseArray<String> mTextCache = new SparseArray<>(); @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_simpe, parent, false); Log.i("onCreateViewHolder", "CreateTimes == " + mCreateTimes++); return new SimpleHolder(view); } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { Log.i("onBindViewHolder", "BindTimes == " + mBindTimes++ + " Position == " + holder.getAdapterPosition()); Log.i("TEXT_SHOW", "ShowPosition == " + holder.getAdapterPosition()); ((SimpleHolder) holder).mEtSimple.setText(mTextCache.get(holder.getAdapterPosition()), ""); // 如果已经绑定文本变化监听器不再次绑定 if (((SimpleHolder) holder).mEtSimple.getTag() != null && (boolean) ((SimpleHolder) holder).mEtSimple.getTag()) { return; } ((SimpleHolder) holder).mEtSimple.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) { // 如果填入数据与缓存数据相同返回 if (TextUtils.equals(mTextCache.get(holder.getAdapterPosition()), s.toString())) { return; } mTextCache.put(holder.getAdapterPosition(), s.toString()); Log.i("TEXT_PUT", "PutPosition == " + holder.getAdapterPosition()); } }); ((SimpleHolder) holder).mEtSimple.setTag(mBoundWatcher); } @Override public int getItemCount() { return mSimpleNum; } class SimpleHolder extends RecyclerView.ViewHolder { EditText mEtSimple; SimpleHolder(View itemView) { super(itemView); mEtSimple = itemView.findViewById(R.id.et_simple); } } }
处理混乱的重点其实就是在数据输入以后进行保存,每次进行手动赋值。
注意:
1.处理 Key 一定为 int 类型的数据时使用 Sparse*** 之类的数据结构可以节省内存。
2.对于添加过文本变化监听器的 EditText 使用 Tag 进行区分,不要每次都进行 addTextChangedListener 。
3.由于我添加监听时使用的是匿名内部类,所以获取 position 时候使用的为 holder.getAdapterPosition() (或者使用 holder.getLayoutPosition()),这是必要的,否则当 position 变为 final 会出现新的问题。
final int position 导致问题.png
相关文章推荐
- RecyclerView + EditText item 复用造成数据混乱
- RecyclerView中EditText数据混乱,FoldingCell折叠布局第一次点击有问题
- Android RecyclerView 中多Item的EditText焦点混乱,数据错乱的解决方法(更新)
- TextView/EditText处理图片显示、字体样式、超链接等 .
- RecyclerView嵌套RecyclerView列表显示数据不完整
- Android开发中Scrollview嵌套recyclerview时,recyclerview不显示数据
- 解决ScrollView里嵌套多个RecyclerView时,RecyclerView数据显示不全的问题
- 在RecyclerView中有多个edittext防止条目过多时滑动recyclerview后edittext内输入内容混乱BUG解决
- Android中解决在ListView历史复用中Edittext数据显示混乱
- RecyclerView嵌套多个布局,多个editText,解决文本输入框上下交换位置中的值问题
- Android 解决在ListView历史复用中Edittext数据显示混乱
- Android RecyclerView嵌套EditView实时更新Item数据
- listview或recyclerView嵌套edittext出现复用问题的解决方式
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等
- Scrollview嵌套recyclerview时不显示数据
- 基础向:recyclerView 内嵌 edittext checkbox 焦点获取、数据紊乱以及数据保存问题
- RecyclerView嵌套ListView 只显示一条数据
- RecyclerView EditText 数据错乱问题
- RecyclerView+EditText 动态搜索数据
- Android 解决在ListView历史复用中Edittext数据显示混乱