- 在为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()方法,因此,首先应该判断是否有, 有的话先移除,再添加