如何通过ItemTouchHelper.SimpleCallback从Adapter向Fragment传递数据?
解决方案
1. 更新滑动监听接口
先修改SwipeItemTouchListener,让onSwiped方法支持传递模型ID:
interface SwipeItemTouchListener{ fun onSwiped(holder: RecyclerView.ViewHolder?, direction: Int, modelId: String) // 按实际ID类型调整(比如Int) // 其他方法... }
2. 自定义ViewHolder存储模型ID
给Adapter定义自定义ViewHolder,添加字段保存当前项的ID:
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var modelId: String? = null // 匹配你的ID类型 // 其他视图绑定逻辑... }
3. 在Adapter中绑定ID到ViewHolder
更新Adapter的onBindViewHolder以"班store sitevCL�物(负责 SPDX(如果),把当前项的ID赋值给ViewHolder:
class MyAdapter : PagingDataAdapter<MyModel, MyViewHolder>(ModelComparator) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false) return MyViewHolder(view) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val mymodel = getItem(position) mymodel?.let { holder.modelId = it.data.id // 将ID赋值给ViewHolder // 其他视图绑定逻辑... } } }
4. 修改ItemTouchHelperSwipe传递ID
在ItemTouchHelperSwipe的onSwiped方法中,从ViewHolder取出ID再调用接口方法:
class ItemTouchHelperSwipe(private val swipeItemTouchListener: SwipeItemTouchListener): ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT){ override fun onSwiped(viewHolder: RecyclerView.ViewHolder,direction:Int) { val myViewHolder = viewHolder as MyViewHolder myViewHolder.modelId?.let { id -> swipeItemTouchListener.onSwiped(viewHolder, direction, id) } } // 其他重写方法... }
5. 在Fragment中接收并使用ID
最后更新Fragment的onSwiped实现,直接使用传递过来的ID:
class MyFragment : Fragment(), SwipeItemTouchListener { override fun onSwiped(holder: RecyclerView.ViewHolder?, direction: Int, modelId: String) { // 这里直接用modelId执行业务逻辑,比如调用ViewModel删除数据 // 示例:viewModel.deleteItem(modelId) } }
关键注意事项
- 确保ViewHolder类型强转安全,或直接在接口中传递自定义ViewHolder(更推荐传递具体数据)。
- Paging3的
getItem(position)可能返回null,必须用空安全操作符处理,避免空指针异常。 - 如果ID类型不是String,需同步调整所有对应位置的类型。
内容的提问来源于stack exchange,提问作者HeraGonz
相关产品推荐
相关产品推荐

