【发布时间】:2021-05-16 04:32:54
【问题描述】:
我有水平 Recyclerview 并想禁用它的手动滚动。但是在点击项目时它应该滚动。怎么做?
【问题讨论】:
-
请检查下面的线程。它可能会有所帮助。 stackoverflow.com/questions/30222310/…
标签: android android-recyclerview
我有水平 Recyclerview 并想禁用它的手动滚动。但是在点击项目时它应该滚动。怎么做?
【问题讨论】:
标签: android android-recyclerview
在你的调用中实现 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
【讨论】:
// 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
【讨论】:
你必须为此创建一个自定义布局管理器,你可以通过这种方式禁用滚动
示例:
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();
}
这样你可以禁用手动滚动
【讨论】:
感谢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 }
}
【讨论】: