求助:使用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
相关产品推荐
相关产品推荐

