Отключить прокрутку в дочерней программе Recyclerview android

У меня есть макет состоит из Parent RecyclerView с дополнительным Recyclerview в нем

Я знаю, что это нехорошо помещать список внутри другого списка, но мне нужно, чтобы я мог использовать функции вспомогательного списка, такие как прокрутка и перетаскивание

Моя проблема в том, что дочерний Recyclerview получает фокус и останавливает родителя от прокрутки, если на нем была точка касания просто я хочу, чтобы прикосновение было вертикально к ребенку Recyclerview родительский свиток вверх и вниз, и если касание было горизонтальным или щелчком, то элемент списка Recyclerview дочернего элемента перемещается влево и вправо. Любая помощь для достижения этого?

Ответ 1

Наконец-то я нашел решение.

Создать пользовательский LinearLayoutManager

public class CustomLinearLayoutManager extends LinearLayoutManager {
public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);

}

// it will always pass false to RecyclerView when calling "canScrollVertically()" method.
@Override
public boolean canScrollVertically() {
    return false;
}
}

Затем создайте его таким образом, чтобы вертикальная прокрутка

CustomLinearLayoutManager customLayoutManager = new CustomLinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);

Наконец, установите пользовательский макет в качестве менеджера макетов просмотра ресайклеров

recyclerView.setLayoutManager(customLayoutManager);

Ответ 2

В то время как, возможно, не очень хорошая практика иметь встроенные просмотры recycler, иногда вы не можете избежать этого. Возможно, что-то подобное:

public class NoScrollRecycler extends RecyclerView {

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

    public NoScrollRecycler(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public NoScrollRecycler(Context context, AttributeSet attrs, int style){
        super(context, attrs, style);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev){

        //Ignore scroll events.
        if(ev.getAction() == MotionEvent.ACTION_MOVE)
            return true;

        //Dispatch event for non-scroll actions, namely clicks!
        return super.dispatchTouchEvent(ev);
    }
}

Это отключит событие прокрутки, но не события щелчка. Используйте этот класс для "дочернего" RecyclerView. Вы хотите, чтобы ретранслятор PARENT прокручивался, но не ребенок. Ну, это должно сделать это, так как родитель будет просто стандартным RecyclerView, но ребенок будет таким обычным, без прокрутки, но обрабатывает клики. Может потребоваться отключить щелчок для родительского RecyclerView. Не уверен, поскольку я не тестировал это, поэтому рассмотрим его как пример...

Кроме того, чтобы использовать это в XML (если вы не знаете), сделайте следующее:

<com.yourpackage.location.NoScrollRecycler
     ...
     ... >

     ...
     ...

</com.yourpackage.location.NoScrollRecycler>

Ответ 3

На вашем ActivityName.java внутри метода onCreate() напишите:

RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);

Каким-либо образом, если вы используете макет координатора, в случае, если вы хотите упростить ситуацию, и вы хотите отключить вложенную прокрутку.

 <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/activitiesListRV"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
 </android.support.v4.widget.NestedScrollView>

И снова вы применяете тот же принцип: На вашем ActivityName.java внутри метода onCreate() напишите:

RecyclerView v = (RecyclerView) findViewById(R.id.your_recycler_view_id);
v.setNestedScrollingEnabled(false);

Итак, в основном в XML, вы должны указать приложение: layout_behavior

app:layout_behavior="@string/appbar_scrolling_view_behavior">

Ответ 4

android:nestedScrollingEnabled="false" в дочернем RecyclerView

Вы можете добавить

android:nestedScrollingEnabled="false"

для вашего RecyclerView в XML или

childRecyclerView.setNestedScrollingEnabled(false);

для вашего RecyclerView в Java.

EDIT: -

childRecyclerView.setNestedScrollingEnabled(false); будет работать только в android_version > 21 устройствах. для работы во всех устройствах используйте следующие

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);

Ответ 5

вы можете использовать setNestedScrollingEnabled(false); на вспомогательном RecyclerView который останавливает прокрутку внутри вспомогательного RecyclerView.

В моем случае код был

mInnerRecyclerView.setNestedScrollingEnabled(false); где mInnerRecyclerView является внутренним RecyclerView.

Ответ 6

Я пробовал много предлагаемых решений и не мог найти тот, который работал в моем случае. У меня есть более 1 RecyclerView внутри ScrollView с помощью GridLayoutManager. Результат из приведенного выше предложения привел к тому, что ScrollView останавливался для прокрутки всякий раз, когда я поднимал палец (он не скользил по верхней или нижней части изображения, когда мой палец был поднят над RecyclerView)

Просматривая источник RecyclerView, внутри onTouchEvent есть вызов менеджера компоновки:

final boolean canScrollHorizontally = mLayout.canScrollHorizontally();
final boolean canScrollVertically = mLayout.canScrollVertically();

Если вы переопределяете их в настраиваемом менеджере макетов, верните false, и он перестанет прокручиваться. Он также устраняет проблему, когда ScrollView перестанет прокручиваться.

Ответ 7

Если вы не хотите создавать пользовательский вид, другой вариант заключается в создании макета такого же размера перед RecyclerView и сделать его доступным для использования.

EDIT: Но, к сожалению, он также блокирует события для элемента списка.

Ответ 8

Я думаю, что я опоздал, но здесь я нашел решение, если это все еще кого-то раздражает:

    RecyclerView v = (RecyclerView); 
    findViewById(R.id.your_recycler_view_id);
    v.setNestedScrollingEnabled(false);
    sensorsRecyclerView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent    event) {
            return true;
        }
    });

Ответ 9

 <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv"
                android:layout_marginTop="2dp"
                android:layout_marginLeft="2dp"
                android:layout_marginBottom="10dp"
                android:layout_marginRight="2dp"
                android:nestedScrollingEnabled="false"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />
                </RelativeLayout>

поместите код в макет Linner... нет необходимости делать что-либо прагматично