精选案例

RecyclerView中EditText数据错乱看这篇就够了

2020-08-26  本文已影响0人  Euirgo

之前项目遇到这个情况,这应该是比较常见的问题吧,但是因为没理清思路,又浪费了好多时间,特此记录下。

解决方法①:

        网上比较暴力的方法就是关闭recyclerView的复用机制,因为数据错乱就是由复用机制引起的,具体操作:在adpter中调用ViewHolder的setIsRecyclable(false);

关闭复用

        优点:方便快捷

        缺点:失去recyclerView的性能优势,在Item数较多时可能存在滑动卡顿。

解决方法②:

         个人更倾向第二种(emmm....因为优雅)

          第二种就是给item种的EiditText注册焦点监听

                    1、在有焦点时添加TextWatcher,失去焦点时添加TextWatcher,同时记录当前焦点的位置focusPosition。

                    2、TextWatcher的afterTextChanged()中把输入数据存入SpareArray。这里有个小坑,之前会在afterTextChanged() 又给EidtText设置文本,导致了OOM,完全没必要,只要在对应item里获取数组中相应位置数据即可。

图2-1 设置Focus监听, 图2-2 TextWatcher存入数据

--------------------------------------- 分割线 -------------------------------

遇到要取出EidtText中的数据上传或者其他操作:

        项目需求是一个订单可能存在多个商品,而每个商品每有一个数量,都要有对应的EidtText,但是保存上传的按钮只有一个,而接口参数又必须是 商品id + 所有输入内容的字符串,而非整个页面的订单id(图3-1),这时就会出现一个问题:当输入框过多时(超过一页),哪怕逐个去取Eidtext中的数据,但是因为RecyclerView的原因,不可见的Item的数据是读取不到。

图3-1

        想到可以直接取Adapter中存输入数据的数组,但是还是会遇到一个问题:因为数组只是针对EditText所在位置和输入数据进行的数据存储,取不到Id。结合商品,可以根据商品的数量,来截取数组中的数据,并在每次点击的保存时重置这个上传参数的值。

图3-2 重置上传数 图3-3 

   如有错误之处,欢迎指出。

上一篇 下一篇

猜你喜欢

热点阅读