[英]How to use ItemTouchHelper.SimpleCallback with ViewPager2?
我使用ViewPager2
創建了一個圖像 slider ,我需要一個功能,當我向上滑動圖像時應該刪除它。 我已經使用過RecyclerView
。 所以我記得我可以使用ItemTouchHelper.SimpleCallback
進行滑動以刪除功能。 但是attachToRecyclerView
方法需要RecyclerView
而不是ViewPager2
即使viewpager2
使用 RecyclerView 適配器。
Kotlin:
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 方法。
ViewPager2
的RecyclerView
默認不可訪問,但您可以使用反射強制其可訪問性。
因為您需要通過使用getDeclaredField()
反映其聲明的字段名稱來訪問RecyclerView
,對於RecyclerView
它是: mRecyclerView (您可以在ViewPager2
類中檢查它)
然后使用setAccessible()
使該字段可訪問,以便允許將其用於ItemTouchHelper
。
這是一個擴展 function 以返回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,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
}
}).attachToRecyclerView(binding.viewPager.getRecyclerView())
預習:
更新:
感謝@SimpleAndroid 的回答,有一種獲取RecyclerView
的好方法:
viewPager.children.find { it is RecyclerView }?.let {
(it as RecyclerView).isNestedScrollingEnabled = isNestedScrollEnabled
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.