How to disable RecyclerView scrolling?
For API 21 and above:
No java code needed.
You can set android:nestedScrollingEnabled="false"
in xml:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="true"
android:nestedScrollingEnabled="false"
tools:listitem="@layout/adapter_favorite_place">
You should override the layoutManager
of your recycleView
for this. This way it will only disable scrolling, none of the other functionalities. You will still be able to handle click or any other touch events. For example:-
Original:
public class CustomGridLayoutManager extends LinearLayoutManager {
private boolean isScrollEnabled = true;
public CustomGridLayoutManager(Context context) {
super(context);
}
public void setScrollEnabled(boolean flag) {
this.isScrollEnabled = flag;
}
@Override
public boolean canScrollVertically() {
//Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll
return isScrollEnabled && super.canScrollVertically();
}
}
Here using "isScrollEnabled" flag you can enable/disable scrolling functionality of your recycle-view temporarily.
Also:
Simple override your existing implementation to disable scrolling and allow clicking.
linearLayoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
return false;
}
};
In Kotlin:
object : LinearLayoutManager(this){ override fun canScrollVertically(): Boolean { return false } }
The real answer is
recyclerView.setNestedScrollingEnabled(false);
More info in documentation
This a bit hackish workaround but it works; you can enable/disable scrolling in the RecyclerView
.
This is an empty RecyclerView.OnItemTouchListener
stealing every touch event thus disabling the target 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 disallowIntercept) {
}
}
Using it:
RecyclerView rv = ...
RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler();
rv.addOnItemTouchListener(disabler); // disables scolling
// do stuff while scrolling is disabled
rv.removeOnItemTouchListener(disabler); // scrolling is enabled again