RecycleView的一些坑

  • 在为RecycleView的动画中,添加删除两个动画有这些坑

问题原因, 在Rv调用notifyItemRemoved(index)方法后,仅仅的UI界面上的刷新,实际上我们的数据源并没有刷新,这样会导致数据混乱,相信很多人都遇到过,坑的咧,

解决办法,以删除item为栗子

        data.remove(index);
        notifyItemRemoved(index);
        notifyItemRangeChanged(index, getItemCount());

需要再次调用下notifyItemRangeChanged()方法通知适配器与数据重新绑定

  • 关于LinearLayoutManager.getChildAt()
        /**
         * Return the child view at the given index
         * @param index Index of child to return
         * @return Child view at index
         */
        public View getChildAt(int index) {
            return mChildHelper != null ? mChildHelper.getChildAt(index) : null;
        }

首先该方法返回的是当前屏幕可见部分view,可能出现 空指针 异常,如果要获得指定位置的view,那么可以用LinearLayoutManager.findViewByPosition()
或者如下,也能解决问题:

int itemPosition = layoutManager.findFirstVisibleItemPosition();
View childAt = layoutManager.getChildAt(position - itemPosition);
  • RecycleView中存在EditText的时候同时又给EditText添加了监听addTextChangedListener(),此时在调用adapter.notifyDataSetChanged()出现edittext中的数据错乱,解决办法:
        EditText ed = holder.getView(R.id.content);
        if (ed.getTag() instanceof TextWatcher) {
            ed.removeTextChangedListener((TextWatcher) ed.getTag());
        }
        ed.setText(formConfig.getEdContent());
        TextWatcher watcher = 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) {
                data.get(position).setEdContent(s.toString());
            }
        };
        ed.addTextChangedListener(watcher);
        ed.setTag(watcher);

原因:recycleview 在复用item 的时候会进行重绘,导致重复添加监听,并且每次都重走了textWatcher的afterTextChanged()方法,因此,首先应该判断是否有, 有的话先移除,再添加

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。