【问题标题】:How to disable manual scroll of Recyclerview?如何禁用 Recyclerview 的手动滚动?
【发布时间】:2021-05-16 04:32:54
【问题描述】:

我有水平 Recyclerview 并想禁用它的手动滚动。但是在点击项目时它应该滚动。怎么做?

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

在你的调用中实现 RecyclerView.OnItemTouchListener 它窃取了 recyclerview 上的所有触摸事件

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    return true;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean) {

}
}

用于启用和禁用滚动:

RecyclerView recycleview = ...
RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler();

recycleview.addOnItemTouchListener(disabler);    // scolling disable
// do what you want to do  at time of disable scrolling
recycleview.removeOnItemTouchListener(disabler); // scrolling enabled again 

【讨论】:

  • 感谢您的回答。会试试的。
  • 这也会禁用 onClick
【解决方案2】:
// You can set `onTouchListener`

public class RecyclerViewTouch implements RecyclerView.OnItemTouchListener {

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

// Use it
RecyclerView.OnItemTouchListener disable = new RecyclerViewTouch();
rView.addOnItemTouchListener(disable);        // disables scolling
rView.removeOnItemTouchListener(disable);     // enable the scrolling

【讨论】:

    【解决方案3】:

    你必须为此创建一个自定义布局管理器,你可以通过这种方式禁用滚动

    示例:

    public class CustomLayoutManager extends LinearLayoutManager {
    private boolean isScrollEnabled = true;
    
    public CustomLayoutManager(Context context) {
        super(context);
    }
    
    public void setScrollEnabled(boolean flag) {
        this.isScrollEnabled = flag;
    }
    
    @Override
    public boolean canScrollHorizontally() {
       //Similarly you can customize "canScrollVertically()" for managing horizontal scroll
        return isScrollEnabled && super.canScrollHorizontally();
    }
    

    这样你可以禁用手动滚动

    【讨论】:

      【解决方案4】:

      感谢Emi Raz。 他的答案非常简单,可以禁用 recyclerview 上的滚动行为。该解决方案对我有用。 请看他的解决方案here

      java:

      LinearLayoutManager lm = new LinearLayoutManager(getContext()) {
          @Override
          public boolean canScrollVertically() {
              return false;
          }
      };
      

      科特林:

      val lm: LinearLayoutManager = object : LinearLayoutManager(requireContext()) {
          override fun canScrollVertically(): Boolean { return false }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        相关资源
        最近更新 更多