Android开发RecyclerView侧滑删除失效,滑动后条目立即回弹问题求助
问题根因
- 数据源没有同步:你初始化Adapter时传入的是
prepareTextForRecycleView()生成的临时String数组,删除操作只修改了MainActivity.speechAsText,没有同步更新Adapter内部持有的数据源,Adapter渲染时还是用旧数据,条目自然会回弹。 - 删除位置逻辑错误:你的列表条目是每2个
speechAsText元素拼接生成,列表的第position个条目对应speechAsText的position*2和position*2+1两个位置,你原来只删了speechAsText的position位置,根本没有删掉对应条目的源数据。 - 全量更新重置UI状态:用
notifyDataSetChanged()是全量重绘所有条目,会直接重置侧滑产生的UI位移,即使数据正确也可能出现回弹问题。
修复步骤
- 先给你的
RecycleAdapter添加更新数据源的方法,示例如下:
// 在RecycleAdapter类中新增 public void updateData(String[] newData) { // 替换Adapter内部保存的数据源,把mData换成你Adapter实际存储数据的变量名即可 this.mData = newData; }
- 修改
onSwiped里的删除逻辑:
@Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { int listPosition = viewHolder.getAdapterPosition(); // 先删索引大的元素,避免删除小索引后下标偏移导致删错数据 MainActivity.speechAsText.remove(listPosition * 2 + 1); MainActivity.speechAsText.remove(listPosition * 2); // 重新生成列表需要的数据源 String[] newData = prepareTextForRecycleView(); // 更新Adapter的数据源 recycleAdapter.updateData(newData); // 用定向删除通知代替全量更新,解决回弹问题 recycleAdapter.notifyItemRemoved(listPosition); Snackbar.make(relativeLayout, "项目已删除", Snackbar.LENGTH_LONG).show(); }
优化建议(适配老年用户)
可以重写`SimpleCallback的滑动触发阈值,避免老人误触,只要在你的callback实现里新增下面这段代码即可:
@Override public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) { // 滑动超过条目宽度50%才触发删除 return 0.5f; }
内容的提问来源于stack exchange,提问作者Breno Moura
相关产品推荐
相关产品推荐

