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

求助:使用ItemTouchHelper.onChildDraw按滑动方向修改View颜色失效问题

解决ItemTouchHelper onChildDraw() 部分View颜色修改失效、TextView可见异常的问题

这问题我之前帮同事排查过,大概率是RecyclerView的Item复用机制导致的状态残留,再加上你没处理滑动结束后的状态重置,才会出现部分View正常、部分异常的情况。咱们一步步来解决:

1. 先解决RecyclerView复用的状态残留问题

RecyclerView的ItemView会被重复利用,如果你滑动修改了某个Item的颜色和TextView可见性,当这个Item被复用到其他数据项时,之前的修改状态会保留下来,导致新绑定的数据项显示异常。

所以必须在Adapter的onBindViewHolder()里重置每个Item的初始状态:

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    // 重置背景色为默认值
    holder.itemView.setBackgroundColor(ContextCompat.getColor(context, R.color.default_item_bg))
    // 重置TextView为可见状态
    holder.swipeTextView.visibility = View.VISIBLE
    
    // 你的其他数据绑定逻辑
    holder.swipeTextView.text = dataList[position].content
}

2. 在onChildDraw()里精准操作当前滑动的ItemView

确保你在onChildDraw()中操作的是当前被滑动的ViewHolder对应的View,不要直接通过RecyclerView找View,而是用方法传入的viewHolder来获取:

override fun onChildDraw(
    c: Canvas,
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder,
    dX: Float,
    dY: Float,
    actionState: Int,
    isCurrentlyActive: Boolean
) {
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
    val currentItemView = viewHolder.itemView
    val holder = viewHolder as MyViewHolder
    
    // 根据滑动方向(dX正负判断左右滑)修改状态
    if (dX < 0) { // 左滑
        currentItemView.setBackgroundColor(ContextCompat.getColor(recyclerView.context, R.color.swipe_left_bg))
        holder.swipeTextView.visibility = View.INVISIBLE
    } else if (dX > 0) { // 右滑
        currentItemView.setBackgroundColor(ContextCompat.getColor(recyclerView.context, R.color.swipe_right_bg))
        holder.swipeTextView.visibility = View.INVISIBLE
    }
}

3. 滑动结束后必须重置状态(关键!)

很多人会忽略clearView()方法,这个方法是ItemTouchHelper在滑动手势结束后自动调用的,用来清理滑动状态,必须在这里把ItemView恢复到初始状态:

override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
    super.clearView(recyclerView, viewHolder)
    val holder = viewHolder as MyViewHolder
    // 恢复默认背景色
    holder.itemView.setBackgroundColor(ContextCompat.getColor(recyclerView.context, R.color.default_item_bg))
    // 恢复TextView可见
    holder.swipeTextView.visibility = View.VISIBLE
}

关于onChildDrawOver的说明

你觉得不需要实现这个方法是对的!onChildDrawOver()是用来在RecyclerView的顶层绘制内容(比如滑动时显示的删除/收藏图标),你的问题和这个方法完全无关,不用纠结。

按照上面的步骤修改后,所有Item的滑动状态都会正确更新,不会再出现部分生效、TextView状态异常的情况了。

内容的提问来源于stack exchange,提问作者Adrian Coutsoftides

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:51:59