Как установить максимальную высоту RecyclerView
Я хочу установить максимальную высоту RecylerView. Я могу установить максимальную высоту, используя приведенный ниже код. Значение кода составляет 60% текущего экрана.
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int a = (displaymetrics.heightPixels * 60) / 100;
recyclerview1.getLayoutParams().height = a;
Но теперь проблема в том, что если у нее нет элемента, то и его высота равна 60%.
Поэтому я хочу установить его высоту 0, когда в нем нет элемента.
Я хочу достичь чего-то.
if(recyclerview height > maxHeight)
then set recyclerview height to maxHeight
else dont change the height of recyclerview.
Как я могу установить его?
Пожалуйста, помогите мне, я застрял с ней.
Ответы
Ответ 1
Вот что вам нужно. Подкласс RecyclerView и переопределить onMeasure следующим образом:
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
heightSpec = MeasureSpec.makeMeasureSpec(Utils.dpsToPixels(240), MeasureSpec.AT_MOST);
super.onMeasure(widthSpec, heightSpec);
}
Убедитесь, что вы указываете правильное количество пикселей в качестве первого аргумента в makeMeasureSpec()
. Я лично нуждался в RecyclerView, который не более 240dps.
Ответ 2
Мы можем немного оптимизировать метод @Fattum. Мы можем использовать app:maxHeight
для установки maxHeight
. Можно использовать dp
или px
как вам нравится.
public class MaxHeightRecyclerView extends RecyclerView {
private int mMaxHeight;
public MaxHeightRecyclerView(Context context) {
super(context);
}
public MaxHeightRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize(context, attrs);
}
public MaxHeightRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize(context, attrs);
}
private void initialize(Context context, AttributeSet attrs) {
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
mMaxHeight = arr.getLayoutDimension(R.styleable.MaxHeightScrollView_maxHeight, mMaxHeight);
arr.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mMaxHeight > 0) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxHeight, MeasureSpec.AT_MOST);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Значения /attrs.xml
<declare-styleable name="MaxHeightScrollView">
<attr name="maxHeight" format="dimension" />
</declare-styleable>
Ответ 3
ConstraintLayout предлагает максимальную высоту для своих детей.
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:scrollbars="vertical"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_max="300dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Ответ 4
записывать эти утверждения внутри if else
и дайте мне знать,
ViewGroup.LayoutParams params=recyclerview.getLayoutParams();
params.height=100;
recyclerview.setLayoutParams(params);
Ответ 5
Вы можете использовать WRAP_CONTENT в своем RecyclerView. Он будет автоматически измерять ваш recyclerview в соответствии с его содержанием.
Вы также можете рассчитать текущую высоту и установить максимальную высоту. Поэтому Recyclerview будет использовать значение атрибута wrap_content до максимальной высоты.
public static void getTotalHeightofRecyclerView(RecyclerView recyclerView) {
RecyclerView.Adapter mAdapter = recyclerView.getAdapter();
int totalHeight = 0;
for (int i = 0; i < mAdapter.getItemCount(); i++) {
View mView = recyclerView.findViewHolderForAdapterPosition(i).itemView
mView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
totalHeight += mView.getMeasuredHeight();
}
if (totalHeight > 100) {
ViewGroup.LayoutParams params = recyclerView.getLayoutParams();
params.height = 100;
recyclerView.setLayoutParams(params);
}
}
Ответ 6
Если у вас есть RecyclerView, предназначенный для хранения предметов с равным физическим размером, и вам нужен простой способ ограничить его высоту без расширения RecyclerView, попробуйте следующее:
int maxRecyclerViewHeightPixels = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
MAX_RECYCLERVIEW_HEIGHT_DP,
getResources().getDisplayMetrics()
);
MyRecyclerViewAdapter myRecyclerViewAdapter = new MyRecyclerViewAdapter(getContext(), myElementList);
myRecyclerView.setAdapter(myRecyclerViewAdapter);
ViewGroup.LayoutParams params = myRecyclerView.getLayoutParams();
if (myElementList.size() <= MAX_NUMBER_OF_ELEMENTS_TO_DISPLAY_AT_ONE_TIME) {
myRecyclerView.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
//LinearLayout must be replaced by whatever layout type encloses your RecyclerView
}
else {
params.height = maxRecyclerViewHeightPixels;
myRecyclerView.setLayoutParams(params);
}
Это работает как для Linear, так и для Grid RecyclerViews, вам просто нужно сыграть с цифрами немного в соответствии с вашим вкусом. Не забудьте установить высоту WRAP_CONTENT после заполнения RecyclerView.
Вы также можете установить высоту снова каждый раз, когда изменяется размер myElementList, но это не большая проблема.
Ответ 7
Самый простой способ - использовать ConstraintLayout и установить ограничение высоты в Recycleview.
<android.support.constraint.ConstraintLayout
android:id="@+id/CL_OUTER_RV_Choose_Categories "
android:layout_width="match_parent"
android:layout_height="200dp">
<android.support.v7.widget.RecyclerView
android:id="@+id/RV_Choose_Categories"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layout_constrainedHeight="true" >
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
Обратите внимание, что до Lollipop, повторное просмотр не будет прокручиваться. В качестве решения добавьте приведенный ниже код в действие по созданию.
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
ConstraintLayout CL_OUTER_RV_Choose_Categories = findViewById(R.id.CL_OUTER_RV_Choose_Categories);
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) CL_OUTER_RV_Choose_Categories.getLayoutParams();
lp.height = LinearLayout.LayoutParams.WRAP_CONTENT;
}
Это обеспечит фиксированную высоту только на поддерживаемых устройствах, а полный просмотр корзины показан на старых устройствах.
Дайте мне знать, если есть какой-нибудь лучший способ.
Ответ 8
Вы можете просто установить определенную высоту для любого значения в коде xml и установить видимость ушел. Затем вы устанавливаете видимость Видимый в Java, когда хотите его раздувать. Вот пример;
.xml
android:visibility="gone"
.java
recyclerView.setVisibility(View.VISIBLE);
Ответ 9
Перепробовав слишком много сложных предложений, я наконец понял это методом проб и ошибок.
Во-первых, оберните RecyclerView в какой-то макет. В моем случае я использовал макет ограничения, и у меня даже были другие элементы в этом макете выше и ниже RecyclerView. Установите высоту макета для автоматической настройки, установив для нее значение 0dp, затем установите ограничение высоты макета по умолчанию в качестве переноса и определите ограничение максимальной высоты макета.
Затем в вашем RecyclerView установите высоту wrap_content и layout_constrainedHeight в значение true.
Вот как это должно выглядеть:
<android.support.constraint.ConstraintLayout
android:layout_width="600px"
android:layout_height="0dp"
app:layout_constraintHeight_default="wrap"
app:layout_constraintHeight_max="450px">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constrainedHeight="true"
app:layout_constraintTop_ToTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
Надеюсь, это поможет!