Làm cách nào để tắt cuộn RecyclerView?


221

Tôi không thể vô hiệu hóa cuộn trong RecyclerView. Tôi đã thử gọi rv.setEnabled(false)nhưng tôi vẫn có thể cuộn.

Làm thế nào tôi có thể vô hiệu hóa cuộn?


1
Điểm sử dụng RecyclerViewnếu bạn không muốn cuộn là gì?
CommonsWare

16
@CommonsWare, tôi chỉ muốn tắt nó tạm thời, ví dụ, trong khi tôi đang thực hiện một hoạt hình tùy chỉnh với một trong những đứa con của nó.
Zsolt Safrany

1
Ah, OK, điều đó có ý nghĩa. Có lẽ tôi đã đặt một lớp trong suốt Viewlên trên RecyclerView, chuyển đổi giữa VISIBLEGONEkhi cần, nhưng cách tiếp cận của bạn có vẻ hợp lý.
CommonsWare

Hy vọng điều này sẽ giúp tìm ra một giải pháp tốt hơn.
Saiteja Parsi

1
@CommonsWare, đây là những gì tôi cần nó, ví dụ. Tôi cần hiển thị hình ảnh trong RecyclerView một lần, không có hình ảnh hiển thị một phần, chỉ có một hình ảnh trong chế độ xem của tôi. Và có những mũi tên ở bên trái và bên phải mà người dùng có thể điều hướng. Tùy thuộc vào hình ảnh nào hiện đang được hiển thị (chúng thuộc nhiều loại khác nhau), một số thứ bên ngoài RecyclerView được kích hoạt. Đó là thiết kế mà khách hàng của chúng tôi muốn.
Varvara Kalinina

Câu trả lời:


368

Bạn nên ghi đè trình bố trí của biểu đồ tái chế của bạn cho việc này. Bằng cách này, nó sẽ chỉ vô hiệu hóa cuộn, không có chức năng nào khác. Bạn vẫn có thể xử lý nhấp chuột hoặc bất kỳ sự kiện chạm nào khác. Ví dụ:-

Nguyên:

 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();
 }
}

Tại đây, sử dụng cờ "isScrollEnabled", bạn có thể bật / tắt chức năng cuộn của chế độ xem tái chế của mình tạm thời.

Cũng thế:

Đơn giản ghi đè thực hiện hiện tại của bạn để vô hiệu hóa cuộn và cho phép nhấp.

 linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};

2
Đây phải là câu trả lời chính xác vì nó vô hiệu hóa cuộn trong khi cho phép tôi nhấp.
Jared Burrows

10
Vô hiệu hóa cuộn trên LayoutMangers mặc định đã tồn tại, người dùng API không cần phải làm điều này. Cảm ơn vì câu trả lời!
Martin O'Shea

1
Điều gì xảy ra nếu tôi muốn tắt chỉ cuộn từ một mục nhất định? Có nghĩa là bạn có thể cuộn xuống (hoặc lên) đến nó, nhưng sau đó bị chặn, cho đến khi tôi kích hoạt lại nó?
nhà phát triển Android

2
Điều này cũng vô hiệu hóa smoothScrollToPocation
Mladen Rakonjac

4
bạn thêm đối tượng phiên bản kotlin: linearLayoutManager (this) {ghi đè vui vẻ canScrollVertively (): Boolean {return false}}
amorenew

149

Câu trả lời thực sự là

recyclerView.setNestedScrollingEnabled(false);

Thêm thông tin trong tài liệu


39
Điều này sẽ chỉ vô hiệu hóa cuộn lồng nhau, không phải tất cả các cuộn. Cụ thể, nếu RecyclerView của bạn ở trong ScrollView nhưng không lấp đầy màn hình, ScrollView sẽ không cuộn (nội dung vừa với màn hình) và bạn sẽ nhận được giao diện người dùng cuộn trong RecyclerView (kết thúc danh sách khi thử cuộn ) mặc dù nó sẽ không cuộn khi nó lớn hơn. Mở rộng LayoutManager thực sự làm công việc.
personne3000

3
@ personne3000 Tôi tin rằng recyclerView.setHasFixedSize (true) thực hiện công việc đó. Chỉnh sửa: Tôi cũng sử dụng kết hợp này với setFillViewport (true) vì vậy tôi không thực sự chắc chắn cái nào trong hai cái đó sửa nó.
mDroidd

5
Điều này hoạt động tốt với tôi, nhưng "RecyclerView" của tôi nằm trong bố cục Fragment bằng cách sử dụng "ScrollView", vì vậy tôi đã phải thay đổi "ScrollView" bằng "NestedScrollView", như được mô tả ở đây: stackoverflow.com/a/38088902/618464
giáo dục

1
Hãy nhớ sử dụng tên lớp đầy đủ cho NestedScrollView: android.support.v4.widget.NestedScrollView, như được mô tả ở đây, bởi Chessdork: stackoverflow.com/questions/37846245/
gustavoknz

Sau khi dành 4 giờ để cố gắng tìm ra cái gì sai, điều này đã giải quyết vấn đề của tôi. Trong trường hợp của tôi, tôi đang sử dụng một recyclerview bên trong MotionLayout. Và tôi chỉ thêm một vùng vuốt để kéo lên bằng cách thêm chuyển động: touchAnchorId = "@ id / swipe_area". Nó hoạt động bình thường nhưng cũng được kích hoạt khi chạm vào các khu vực trống của recyclerview. Hãy cẩn thận khi sử dụng MotionLayout với các yếu tố có thể vuốt khác.
O. Kumru

73

Câu trả lời THỰC SỰ là: Dành cho API 21 trở lên:

Không cần mã java. Bạn có thể đặt android:nestedScrollingEnabled="false" trong 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">

11
Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận, mà không cần bất kỳ nỗ lực nào trong lớp, bạn có thể vô hiệu hóa cuộn và cảm ứng được cho phép trong bố cục.
VipiN Negi

Điều gì cho API dưới 21 ??
Mouaad Abdelghafour AITALI

@pic cho các API thấp hơn bạn có thể sử dụng: recyclerView.setNestedScrollingEnabled (false);
Milad Faridnia

1
Chấp nhận câu trả lời cho tôi.
Fernando Torres

1
đây là câu trả lời hay nhất và đơn giản nhất, cũng tránh ô nhiễm mã không cần thiết và các mẫu mở rộng lớp vô tận.
Raphael C

52

Đây là một cách giải quyết một chút hackish nhưng nó hoạt động; bạn có thể bật / tắt cuộn trong RecyclerView.

Đây là một hành vi RecyclerView.OnItemTouchListenerđánh cắp trống mọi sự kiện chạm do đó vô hiệu hóa mục tiêu 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) {

    }
}

Sử dụng nó:

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 

8
Điều này có vô hiệu hóa các mục nhấp quá không?
Jahir Fiquitiva

@JahirFiquitiva Có. "Đây là một RecyclerView trống rỗng.OnItemTouchListener ăn cắp mọi sự kiện chạm"
Tối đa

1
điều này cũng vô hiệu hóa cuộn của chế độ xem cha mẹ
Jemshit Iskenderov

Điều này cũng vô hiệu hóa mục nhấp chuột
Muhammad Riyaz 7/12/2015

1
Tại sao sử dụng một cách giải quyết hackish (có tác dụng phụ) khi có một giải pháp sạch? Chỉ cần ghi đè Trình quản lý Bố cục (xem các câu trả lời khác)
personne3000

37

Điều này làm việc cho tôi:

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

11
Điều này vô hiệu hóa tất cả các liên lạc.
Jared Burrows

1
Bí quyết đẹp! Để bật lại lần nữa, chỉ cần đặt lại onTouch của onTouchList trở lại sai
HendraWD

uhm, nhưng có một cảnh báoCustom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
HendraWD

Nếu bạn đang nhận được cảnh báo tương tự mà @HendraWD đã đề cập trong nhận xét ở trên thì hãy xem câu trả lời của câu hỏi này: stackoverflow.com/questions/46135249/ Lỗi
Nicolás Carrasco

1
Thay vì trả về đúng, và do đó vô hiệu hóa tất cả các loại sự kiện chạm, return e.getAction() == MotionEvent.ACTION_MOVE;thay vào đó , chỉ thay vào đó , các sự kiện return true;cuộn / vuốt sẽ bị hủy.
Toufic Batache

15

Bạn có thể vô hiệu hóa cuộn bằng cách đóng băng RecyclerView của bạn.

Đóng băng: recyclerView.setLayoutFrozen(true)

Để giải phóng: recyclerView.setLayoutFrozen(false)


1
Lưu ý: chế độ xem con không được cập nhật khi RecyclerView bị đóng băng. Tôi cần tắt cuộn khi có đủ chỗ trên màn hình để hiển thị tất cả các mục. Ôi ... Thật là một API Android tuyệt vời cho nhiệm vụ này ...
Oleksandr Nos

1
Không dùng nữa trong API 28
OhhhThatVarun

13

Tạo lớp mở rộng lớp RecyclerView

public class NonScrollRecyclerView extends RecyclerView {

    public NonScrollRecyclerView(Context context) {
        super(context);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

Điều này sẽ vô hiệu hóa sự kiện cuộn, nhưng không phải là sự kiện nhấp

Sử dụng điều này trong XML của bạn làm như sau:

  <com.yourpackage.xyx.NonScrollRecyclerView 
     ...
     ... 
  />

Cảm ơn! Tất cả điều này là cần thiết khi chúng tôi muốn cho phép chế độ xem tái chế lấy toàn bộ chiều cao theo nội dung mà không cần cuộn bên trong. :)
Rahul Rastogi

Nhưng nếu chế độ xem trình tái chế này ở chế độ xem cuộn (egScrollView) thì trình quản lý bố cục sẽ ghi đè phương thức canScrollVertively () trả về sai từ nó.
Rahul Rastogi

@RahulRastogi sử dụng NestedScrollView thay vì ScrollView
Ashish

Xin chào @AshishMangave, Vui lòng cho biết cách bật lại chương trình
Shruti

@Shruti chúng tôi không thể làm điều này theo chương trình. bcz chúng tôi trực tiếp ghi đè phương thức onMeasure của recyclerview. Bạn có thể thử với recyclerView.setNestedScrollingEnables (false) này. Điều này sẽ giúp bạn
Ashish

11

Nếu bạn chỉ vô hiệu hóa chức năng cuộn của RecyclerViewthì bạn có thể sử dụng setLayoutFrozen(true);phương pháp RecyclerView. Nhưng nó không thể vô hiệu hóa sự kiện cảm ứng.

your_recyclerView.setLayoutFrozen(true);

phương pháp này không được chấp nhận bạn có thể đề nghị một cái khác?
Aiyaz Parmar

Không dùng nữa trong API 28
OhhhThatVarun

9
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // Stop only scrolling.
            return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING;
        }
    });


Điều này hủy bỏ việc cuộn smoothScrollToP vị trí () khi chạm vào.
ypresto

Đây là giải pháp tốt nhất cho tôi vì nó cho phép cuộn theo chương trình nhưng tránh cuộn người dùng.
Miguel Sesma

7

Có một câu trả lời thực sự đơn giản.

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

Đoạn mã trên vô hiệu hóa cuộn RecyclerView theo chiều dọc.



6

Đã viết một phiên bản kotlin:

class NoScrollLinearLayoutManager(context: Context?) : LinearLayoutManager(context) {
    private var scrollable = true

    fun enableScrolling() {
        scrollable = true
    }

    fun disableScrolling() {
        scrollable = false
    }

    override fun canScrollVertically() =
            super.canScrollVertically() && scrollable


    override fun canScrollHorizontally() =
            super.canScrollVertically()

 && scrollable
}

sử dụng:

recyclerView.layoutManager = NoScrollLinearLayoutManager(context)
(recyclerView.layoutManager as NoScrollLinearLayoutManager).disableScrolling()

5

Mở rộng LayoutManagervà ghi đè canScrollHorizontally()canScrollVertically()để vô hiệu hóa cuộn.

Xin lưu ý rằng việc chèn các mục ở đầu sẽ không tự động cuộn trở lại từ đầu, để giải quyết vấn đề này như sau:

  private void clampRecyclerViewScroll(final RecyclerView recyclerView)
  {
    recyclerView.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
    {
      @Override
      public void onItemRangeInserted(int positionStart, int itemCount)
      {
        super.onItemRangeInserted(positionStart, itemCount);
        // maintain scroll position at top
        if (positionStart == 0)
        {
          RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
          if (layoutManager instanceof GridLayoutManager)
          {
            ((GridLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }else if(layoutManager instanceof LinearLayoutManager)
          {
            ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }
        }
      }
    });
  }

1
điều này cũng vô hiệu hóa smoothScrollToPocation
Mladen Rakonjac

5

Tôi biết điều này đã có câu trả lời được chấp nhận, nhưng giải pháp không tính đến trường hợp sử dụng mà tôi đã gặp.

Tôi đặc biệt cần một mục tiêu đề vẫn có thể nhấp được, nhưng đã vô hiệu hóa cơ chế cuộn của RecyclerView. Điều này có thể được thực hiện với mã sau đây:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                            @Override
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
         return e.getAction() == MotionEvent.ACTION_MOVE;
     }

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

     }

     @Override
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

Đối với một số lý do, bạn phải bấm vừa phải, mà không di chuyển để làm việc này.
Jared Burrows

Điểm tốt, @JaredBurrows. Điều này là do chúng tôi không quan tâm đến ACTION_MOVE. Để cảm ứng tự nhiên, có một số cho giữa chạm và chuyển động nhẹ trên màn hình. Thật không may, tôi đã không thể giải quyết vấn đề đó.
Ryan Simon

Cảm ơn, chính xác những gì tôi cần!
Sinh viên

5

setLayoutFrozenkhông được dùng nữa, Bạn có thể vô hiệu hóa cuộn bằng cách đóng băng RecyclerView bằng cách sử dụng suppressLayout.

Đóng băng:

recyclerView.suppressLayout(true)

Để giải phóng:

recyclerView.suppressLayout(false)

4

trong XML: -

Bạn có thể thêm

android:nestedScrollingEnabled="false"

trong tệp XML bố trí RecyclerView con

hoặc là

trong Java: -

childRecyclerView.setNestedScrollingEnabled(false);

để RecyclerView của bạn trong mã Java.

Sử dụng ViewCompat (Java): -

childRecyclerView.setNestedScrollingEnabled(false);sẽ chỉ hoạt động trong android_version> 21 thiết bị. để làm việc trong tất cả các thiết bị sử dụng như sau

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);


Excelent, tất cả các apis được bảo hiểm, nên được cấp nguồn.
Ricard

3

Vì một số lý do, câu trả lời @Alejandro Gracia chỉ bắt đầu hoạt động sau vài giây. Tôi đã tìm thấy một giải pháp chặn RecyclerView ngay lập tức:

recyclerView.addOnItemTouchListener(new 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) {
            }
        });

3

Ghi đè onTouchEvent () và onInterceptTouchEvent () và trả về false nếu bạn không cần OnItemTouchListener. Điều này không vô hiệu hóa OnClickListener của ViewHolders.

public class ScrollDisabledRecyclerView extends RecyclerView {
    public ScrollDisabledRecyclerView(Context context) {
        super(context);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }
}

3

Bạn có thể thêm dòng này sau khi cài đặt bộ điều hợp của bạn

ViewCompat.setNestedScrollingEnabled(recyclerView, false);

Bây giờ recyclerview của bạn sẽ hoạt động với cuộn mượt mà


2

Tôi đã phải vật lộn trong vấn đề này trong một vài giờ, vì vậy tôi muốn chia sẻ kinh nghiệm của mình, đối với giải pháp layoutManager thì không sao nhưng nếu bạn muốn cuộn lại, thì trình tái chế sẽ trở lại đầu trang.

Giải pháp tốt nhất cho đến nay (đối với tôi ít nhất) là sử dụng @Zsolt Safrany methode nhưng thêm getter và setter để bạn không phải xóa hoặc thêm OnItemTouchListener.

Như sau

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    boolean isEnable = true;

    public RecyclerViewDisabler(boolean isEnable) {
        this.isEnable = isEnable;
    }

    public boolean isEnable() {
        return isEnable;
    }

    public void setEnable(boolean enable) {
        isEnable = enable;
    }

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

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

   @Override
   public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){}
 }

Sử dụng

RecyclerViewDisabler disabler = new RecyclerViewDisabler(true);
feedsRecycler.addOnItemTouchListener(disabler);

// TO ENABLE/DISABLE JUST USE THIS
disabler.setEnable(enable);

2

Trong Kotlin, nếu bạn không muốn tạo một lớp bổ sung chỉ để đặt một giá trị, bạn có thể tạo lớp ẩn danh từ LayoutManager:

recyclerView.layoutManager = object : LinearLayoutManager(context) {
    override fun canScrollVertically(): Boolean = false
}

1

Đây là cách tôi đã làm với ràng buộc dữ liệu:

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipChildren="false"
                android:onTouch="@{(v,e) -> true}"/>

Thay cho "true", tôi đã sử dụng biến boolean thay đổi dựa trên một điều kiện để chế độ xem của trình tái chế sẽ chuyển đổi giữa bị vô hiệu hóa và được bật.


1

Đã đi qua với một đoạn có chứa nhiều RecyclView vì vậy tôi chỉ cần một thanh cuộn thay vì một thanh cuộn trong mỗi RecyclView.

Vì vậy, tôi chỉ cần đặt ScrollView trong vùng chứa chính chứa 2 RecyclViews và sử dụng android:isScrollContainer="false"trong RecyclView

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:isScrollContainer="false" />

1

Thêm vào

android:descendantFocusability="blocksDescendants"

trong con của bạn là SrollView hoặc NestedScrollView (và cha mẹ của ListView, recyclerview và Gridview bất kỳ ai)


1

Có một cách đơn giản hơn để vô hiệu hóa cuộn (về mặt kỹ thuật, nó đúng hơn là chặn sự kiện cuộn và kết thúc khi điều kiện được đáp ứng), chỉ sử dụng chức năng tiêu chuẩn. RecyclerViewcó phương thức được gọi addOnScrollListener(OnScrollListener listener)và chỉ sử dụng phương thức này, bạn có thể ngăn không cho cuộn, chỉ cần như vậy:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (viewModel.isItemSelected) {
            recyclerView.stopScroll();
        }
    }
});

Ca sử dụng: Giả sử bạn muốn tắt tính năng cuộn khi bạn nhấp vào một trong các mục bên trong RecyclerViewđể bạn có thể thực hiện một số hành động với nó, mà không bị phân tâm khi vô tình cuộn sang mục khác và khi bạn hoàn thành việc đó, chỉ cần nhấp vào mục một lần nữa để cho phép cuộn. Vì thế, bạn sẽ muốn đính kèm OnClickListenervào mọi mục bên trong RecyclerView, vì vậy khi bạn nhấp vào một mục, nó sẽ chuyển isItemSelectedtừ falsesang true. Bằng cách này khi bạn cố cuộn, RecyclerViewsẽ tự động gọi phương thức onScrollStateChangedvà kể từ khi isItemSelectedđược đặt thành true, nó sẽ dừng ngay lập tức, trước khi RecyclerViewcó cơ hội, cũng ... để cuộn.

Lưu ý: để sử dụng tốt hơn, hãy thử sử dụng GestureListenerthay vì OnClickListenerđể ngăn chặn accidentalnhấp chuột.


stopScroll()không phải là để đóng băng cuộn, nó chỉ dừng lại / dừng cuộn recyclerview.
Farid

@FARID, vâng, phương pháp này chỉ dừng bất kỳ cuộn nào đang diễn ra và trong trường hợp cụ thể này, nó thực hiện điều đó mỗi khi người dùng cố gắng cuộn nội dung RecyclerView isItemSelectedđược đặt thành true. Mặt khác, bạn sẽ cần một RecyclerView tùy chỉnh để vô hiệu hóa cuộn cho tốt và tôi muốn tránh nó vì tôi chỉ cần một chức năng bổ sung nhỏ, mà giải pháp này cung cấp.
Tim Jorjev

0

Chỉ cần thêm phần này vào chế độ xem lại của bạn trong xml

 android:nestedScrollingEnabled="false"

như thế này

<android.support.v7.widget.RecyclerView
                    android:background="#ffffff"
                    android:id="@+id/myrecycle"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:nestedScrollingEnabled="false">

0

Để dừng cuộn bằng cách chạm nhưng tiếp tục cuộn qua các lệnh:

if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);

        appTopBarMessagesRV.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

                if ( rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING)
                {
                     // Stop  scrolling by touch

                    return false;
                }
                return  true;
            }
        });
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.