如何在 ViewPager2 中使用 ItemTouchHelper.SimpleCallback?

如何解决如何在 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 slider

解决方法

这是从 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 方法。

,

默认情况下,RecyclerViewViewPager2 不可访问,但您可以使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?