禁用RecyclerView的触摸事件(以防止用户触摸)?

21

我的应用中有一个RecyclerView,它会显示数据。我想禁用用户对RecyclerView的触摸事件。我已经尝试了下面的代码,但它没有起作用。

recyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return false;
    }
});

请帮助我。


您可以在每个项目上检查触摸事件。http://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html - Wasim K. Memon
我会扩展RecyclerView并覆盖onTouch和onInterceptTouchEvent方法,以始终返回false。 - Olsi Saqe
6个回答

24

因为我几天前有一个类似的用例,刚刚偶然发现了这个问题:
你可以添加以下内容之一:

到你的 RecyclerView。

使用 RecyclerView.SimpleOnItemTouchListener 的示例:

recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        // true: consume touch event
        // false: dispatch touch event
        return true;
   }
});

当我的SwipeRefreshLayout正在执行后台任务并查询swipeLayout.isRefreshing()时,我消耗了触摸事件。


12

Java:

recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }
});

Kotlin:

recyclerView.addOnItemTouchListener(object : RecyclerView.SimpleOnItemTouchListener() {
    override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
        return true
    }
})

只需使用此方法,我的问题已得到解决 (;

请注意,使用此方法不仅无法触摸,也无法滚动。 - Joonsoo
2
这并不能阻止在Android Q上进行触摸测试。我通过编程设置了平滑滚动,然后在滚动时触摸,它就停止了。 - Code Wiget

9
你可以使用RecyclerView的函数 public void setLayoutFrozen(boolean frozen) 来冻结布局。

你确定吗?https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setLayoutFrozen(boolean) - diAz
1
setLayoutFrozen(boolean frozen)已被弃用,请使用suppressLayout(boolean suppress)代替。 - Mohamed Khaled
1
当调用 suppressLayout(true) 时,adapter.notifyDataSetChangedadapter.notifyItemChanged(int position) 将不起作用。 - Yt100

8
你可以使用yourRecyclerView.suppressLayout(true)禁用用户交互。

太棒了,对于我禁用嵌套RecyclerView上的触摸事件的使用情况,它像魔法一样工作。 - Burhan Khanzada

7
如果返回true,则会禁用触摸事件。
如果返回false,则将启用触摸事件。
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        return true;
   }
});

希望它有所帮助...


0

您可以重写 LinearLayoutManager 的 canScrollHorizontally 方法

getRecyclerView().setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false) {
    @Override
    public boolean canScrollHorizontally() {
        return false;
    }
});

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