You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

attachToRecyclerView未移除RecyclerView旧ItemTouchHelper问题求解

问题根因

你对attachToRecyclerView()的生效范围理解存在偏差:这个方法的自动解绑逻辑仅适用于同一个ItemTouchHelper实例重复绑定RecyclerView的场景。你每次调用setupRecyclerView()都会创建全新的ItemTouchHelper实例,旧实例没有被主动解绑,它给RecyclerView设置的触摸监听还会继续生效,因此侧滑事件会优先触发先注册的旧实例回调,自然关联的自然是旧Adapter的逻辑。

最佳实践方案

方案1:复用Adapter,重置数据不换实例(最推荐)

Adapter本身设计为支持动态更新数据的组件,不需要每次重置数据就创建新实例,从根源避免侧滑逻辑错位问题,性能也更好:

  1. 将Adapter和ItemTouchHelper定义为Fragment成员变量,仅在页面初始化时创建一次
// Fragment成员变量
private lateinit var historyAdapter: HistoryListAdapter
private lateinit var itemTouchHelper: ItemTouchHelper

// 页面初始化时仅调用一次
private fun initRecyclerView() {
    historyAdapter = HistoryListAdapter(mutableListOf())
    val callback = HistorySwipeHelper(historyAdapter)
    itemTouchHelper = ItemTouchHelper(callback)
    history_games_list.adapter = historyAdapter
    itemTouchHelper.attachToRecyclerView(history_games_list)
}
  1. 重置数据时直接更新Adapter数据集即可
private fun updateHistoryData(historyList: MutableList<HistoryObject>) {
    // 如果使用ListAdapter直接调用submitList即可
    historyAdapter.submitList(historyList)
    // 普通自定义Adapter可以更新内部数据集后调用差分更新或notifyDataSetChanged()
}

方案2:确需更换Adapter时先清理旧侧滑逻辑

如果业务上必须每次更换Adapter实例的话,可以通过遍历删除ItemDecoration的方式清理旧的ItemTouchHelper,不需要单独维护成员变量:

private fun setupRecyclerView(historyList: MutableList<HistoryObject>) {
    // 先移除所有旧的ItemTouchHelper
    for (i in 0 until history_games_list.itemDecorationCount) {
        val decor = history_games_list.getItemDecorationAt(i)
        if (decor is ItemTouchHelper) {
            history_games_list.removeItemDecoration(decor)
        }
    }
    val historyListAdapter = HistoryListAdapter(historyList)
    val callback = HistorySwipeHelper(historyListAdapter)
    val helper = ItemTouchHelper(callback)
    history_games_list.adapter = historyListAdapter
    helper.attachToRecyclerView(history_games_list)
}

内容的提问来源于stack exchange,提问作者Daniel Bank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:45:04