RecyclerView, который не прокручивает и не показывает все элементы

У меня есть RecyclerView (и некоторые другие виды) в ScrollView. В настоящее время RecyclerView выложен как очень маленький (он отображает 2 элемента из 5, которые он содержит), и он прокручивается независимо от ScrollView, что, очевидно, не является большим UX. Я бы хотел, чтобы RecyclerView не прокручивался и не расширялся, чтобы все его элементы были видны.

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

Ответ 1

Его довольно просто, просто установите высоту RecyclerView s wrap_content.

Вам также может быть полезно отключить вложенную прокрутку в представлении recycler, например:

RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
recycler.setNestedScrollingEnabled(false);

Ответ 2

Решение setNestedScrollingEnabled (false) не так полно, как должно: вам нужно использовать NestedScrollView вместо ScrollViewfocusableInTouchMode = "true" для дочернего элемента NestedScrollView.

Если вы настаиваете на использовании ScrollView, вы также должны установить minHeight в RecyclerView, а также установить overScrollMode = "never". В этом случае он по-прежнему не является хорошим решением, потому что minHeight может быть недостаточно в некоторых случаях

Другие альтернативные решения, которые вы должны учитывать:

  • Замените ScrollView & RecyclerView с помощью одного RecyclerView, который имеет представления с дополнительным видом для того, что у вас было в ScrollView

  • Вместо этого используйте GridLayout или другой формат.

Ответ 3

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

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/person_properties"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
...
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:overScrollMode="never" />
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

Не нужно ничего менять программно.

Ответ 4

Самый простой способ - использовать в своем пользовательском адаптере внутри метода onBindViewHolder строку: holder.setIsRecyclable(false);

Ответ 5

Также попробуйте сыграть с:

android:overScrollMode

Ответ 6

Ниже приведен код для отключения прокрутки в окне просмотра и отображения всех элементов в макете. Это может сработать:

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

используйте так:

<com.example.custom.NoScrollRecycler
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/color_white"/>

Ответ 7

Вы должны заменить свой scrollView для androidx.core.widget.NestedScrollView на matchparent, он простой и отлично работает.

Ответ 8

Я понял, что я использую BottomNavigationView который заблокировал мое представление переработчика от отображения последнего элемента. Я исправил это, добавив paddingBottom к нему:

    <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recipient_list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="70dp"
                app:layout_constraintTop_toBottomOf="@id/view"
                />