Tôi có một RecyclerView
với LinearLayoutManager
theo hướng HORIZONTAL
. Mỗi mục trong đó có thể có các yếu tố tương tác (bao gồm cả các chiều dọc ScrollView
s). Có cách nào để dễ dàng thực hiện các RecyclerView
bỏ qua bất kỳ nỗ lực nào của người dùng để cuộn hoặc trượt RecyclerView
theo chiều ngang mà không chặn các sự kiện chạm vào trẻ em không?Cách tắt tính năng cuộn RecyclerView ngoại trừ lập trình
Tôi đang điều khiển theo chương trình cuộn của RecyclerView
hoạt động tuyệt vời cho đến khi người dùng bẻ khóa.
Tôi đã thử một cái gì đó rất đơn giản, nơi mà ý tưởng là khi tôi gọi smoothScrollToPosition để đáp ứng với một số sự kiện, tôi cho phép di chuyển và tắt các sự kiện cảm ứng cho đến khi di chuyển lắng xuống. Như thế này:
private class NoScrollHorizontalLayoutManager extends LinearLayoutManager {
ScrollingTouchInterceptor interceptor = new ScrollingTouchInterceptor();
protected boolean canScroll;
public NoScrollHorizontalLayoutManager(Context ctx) {
super(ctx, LinearLayoutManager.HORIZONTAL, false);
}
public RecyclerView.OnItemTouchListener getInterceptor() {
return interceptor;
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
canScroll = true;
super.smoothScrollToPosition(recyclerView, state, position);
}
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
if(state == RecyclerView.SCROLL_STATE_IDLE) {
canScroll = false;
}
}
@Override
public boolean canScrollHorizontally() {
return canScroll;
}
public class ScrollingTouchInterceptor implements RecyclerView.OnItemTouchListener {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
return canScrollHorizontally();
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
}
Và sử dụng nó như thế này ..
NoScrollHorizontalLayoutManager layout = new NoScrollHorizontalLayoutManager(context);
recycler.setLayoutManager(layout);
recycler.addOnItemTouchListener(layout.getInterceptor());
mà thực sự gần công trình ... nhưng tôi vẫn có thể vít lên cuộn chương trình bằng cách chạm vào màn hình khi di chuyển trơn tru đang chuyển động. rõ ràng tôi đang thiếu một cái gì đó rõ ràng hoặc có một cách thông minh hơn nhiều để làm điều này.
CẬP NHẬT giải pháp phi RecyclerView đã được tìm thấy ở đây: How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?
/**
* ViewPager that doesn't allow swiping.
*/
public class NonSwipeableViewPager extends ViewPager {
public NonSwipeableViewPager(Context context) {
super(context);
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
}
Tôi đã kết thúc bằng cách sử dụng một ViewPager thời trang cũ ... hoạt động hoàn hảo với ít mã hơn ... oh well. – danb
Không hiểu bạn đang cố làm gì. –
Đăng mã, cách bạn xử lý nó –