程序化地点击RecyclerView

7

我正在尝试以编程方式点击recyclerView中的项目。 我正在使用:

recyclerView.findViewHolderForAdapterPosition(index).itemView.performClick();

当索引指向可见项时,此方法完美运作。如果该项不可见(例如在recyclerview的最后位置),则会出现异常。

我该怎么办?


1
你应该查看这个答案 RecyclerView onClick - Ahmad Alkhatib
3个回答

10

我刚刚遇到了和你类似的问题,但我已经解决了! 这是我所做的:

xxx.mRecyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                xx.mRecyclerView.scrollToPosition(position);
            }
        },300);


        xxx.mRecyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                xxx.mRecyclerView.findViewHolderForAdapterPosition(position).itemView.performClick();
                }
            },400);
        }

您可以滚动到特定的项目,然后执行单击操作。 因为 文档 中说:

如果给定位置的项目没有布局,它将不会创建新的布局。

但我知道适配器具有数据,所以先滚动到数据位置,然后 findViewHolderForAdapterPosition 就不会为空。

还有一件事,我不知道您如何使用 RecyclerView。在我的应用程序中,我将其用于片段,并且我不知道为什么我们应该延迟它的滚动和单击操作。(也许是因为生命周期?)但这确实有效。


3
您可以直接调用 onClick,假设视图管理其自己的点击侦听器。
View view = recyclerView.findViewHolderForAdapterPosition(index).itemView;
view.onClick(view);

如果点击监听器位于其他位置,则只需获取具有onClick方法的对象的引用,并将其作为参数与正确的视图一起调用。

4
我已尝试了你提供的解决方案,但当该项目不可见时,我会得到空指针异常。 - Antwan

2
尝试使用此方法实现 Kotlin 和 ViewBinding:

尝试这个

 viewBinding.catList.post {
            val view = viewBinding.catList.findViewHolderForAdapterPosition(0)?.itemView?.findViewById<CheckBox>(R.id.catButton)
            view?.callOnClick()
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接