簡體   English   中英

如何將 ItemTouchHelper.SimpleCallback 與 ViewPager2 一起使用?

[英]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 滑塊

這是從 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

注意: RecyclerViewAdapterFragmentStateAdapter都有一個 onAttachedToRecyclerView 方法。

ViewPager2RecyclerView默認不可訪問,但您可以使用反射強制其可訪問性。

因為您需要通過使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM