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"
/>