如何解决如何在 ViewPager2 中使用 ItemTouchHelper.SimpleCallback?
我使用 ViewPager2
创建了一个图像滑块,我需要一个功能,当我向上滑动时,图像应该被移除。我已经与 RecyclerView
合作过。所以我记得我可以使用 itemtouchhelper.SimpleCallback
滑动来删除功能。但是 attachToRecyclerView
方法需要 RecyclerView
而不是 ViewPager2
,即使 viewpager2
使用 RecyclerView 适配器。
科特林:
itemtouchhelper(object : itemtouchhelper.SimpleCallback(0,itemtouchhelper.UP) {
override fun onMove(
recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder,direction: Int) {
}
}).attachToRecyclerView(binding.viewPager)
解决方法
这是从 ViewPager2 获取 RecyclerView 的另一种方法。我假设您有一个名为 PictureItemAdapter 的适配器:
class PictureItemAdapter(private val recyclerViewAttached: (RecyclerView) -> Unit) : RecyclerView.Adapter<PictureItemViewHolder>() {
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
recyclerViewAttached(recyclerView)
}
...
}
您将收到来自 recyclerViewAttached
闭包的 Recycler 视图
val pictureItemAdapter = PictureItemAdapter{ recyclerView ->
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.UP) {
override fun onMove(
recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder,direction: Int) {
}
}).attachToRecyclerView(recyclerView)
}
binding.viewPager.adapter = pictureItemAdapter
注意:RecyclerViewAdapter 和 FragmentStateAdapter 都有一个 onAttachedToRecyclerView 方法。
,默认情况下,RecyclerView
的 ViewPager2
不可访问,但您可以使用 reflection 强制其可访问。
因为您需要通过使用 getDeclaredField()
反映其声明的字段名称来访问 RecyclerView
,对于 RecyclerView
,它是:mRecyclerView(您可以检查它在 ViewPager2
类中)
然后使用 setAccessible()
使该字段可访问,以便允许将其用于 ItemTouchHelper
。
这是一个返回 ViewPager2
ReyclerView
的扩展函数:
fun ViewPager2.getRecyclerView(): RecyclerView? {
try {
val field = ViewPager2::class.java.getDeclaredField("mRecyclerView")
field.isAccessible = true
return field.get(this) as RecyclerView
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
return null
}
你可以像这样使用它:
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.UP) {
override fun onMove(
recyclerView: RecyclerView,target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder,direction: Int) {
}
}).attachToRecyclerView(binding.viewPager.getRecyclerView())
预览:
更新:
感谢 @SimpleAndroid answer,有一个很好的方法来获取 RecyclerView
:
viewPager.children.find { it is RecyclerView }?.let {
(it as RecyclerView).isNestedScrollingEnabled = isNestedScrollEnabled
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。