我想设置RecylerView的最大高度。我可以使用下面的代码设置最大高度。下面的代码使高度为当前屏幕的60%。
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int a = (displaymetrics.heightPixels * 60) / 100;
recyclerview1.getLayoutParams().height = a;
但现在的问题是,如果它没有项目,那么它的高度也是60%。 所以我想在没有项目的情况下将其高度设置为0。
我希望达到类似的效果。
if(recyclerview's height > maxHeight)
then set recyclerview's height to maxHeight
else dont change the height of recyclerview.
我该怎么设置它? 请帮助我,我坚持了它
答案 0 :(得分:33)
这是你需要的东西。对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。
答案 1 :(得分:12)
我们可以稍微优化@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>
答案 2 :(得分:10)
ConstraintLayout为其子女提供最大高度。
var stringCombinations = string.Join(",", combinations.Select(j => $@"""{string.Join(",", j)}"""));
答案 3 :(得分:6)
我认为这至少对我有用
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/Id_const_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/Id_my_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_top_space"
android:scrollbars="vertical"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toBottomOf="@+id/Id_const_layout"
app:layout_constraintEnd_toEndOf="@+id/Id_const_layout"
app:layout_constraintHeight_max="150dp"
app:layout_constraintHeight_min="30dp"
app:layout_constraintStart_toStartOf="@+id/Id_const_layout"
app:layout_constraintTop_toTopOf="@+id/Id_const_layout"
>
</androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>
您可以根据需要更改constraintHeight_max
和constraintHeight_min
。
答案 4 :(得分:2)
在if else中写下这些语句 让我知道,
ViewGroup.LayoutParams params=recyclerview.getLayoutParams();
params.height=100;
recyclerview.setLayoutParams(params);
答案 5 :(得分:2)
尝试了太多复杂的建议之后,我终于通过反复试验弄清楚了。
首先,将RecyclerView包装为某种布局。就我而言,我使用了约束布局,甚至在RecyclerView上方和下方的布局中还有其他元素。通过将其设置为0dp来设置要自动调整的布局高度,然后将默认的布局高度约束设置为wrap并定义一个布局最大高度约束。
然后,在您的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>
希望这会有所帮助!
答案 6 :(得分:1)
您可以在RecyclerView中使用WRAP_CONTENT。它将根据其内容自动测量您的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);
}
}
答案 7 :(得分:0)
如果您设计了一个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);
}
这对于线性和网格RecyclerViews都适用,您只需要稍微调整一下数字就可以满足自己的需求。填充RecyclerView之后,不要忘记将高度设置为WRAP_CONTENT。
每次myElementList的大小更改时,您可能还必须再次设置高度,但这不是大问题。
答案 8 :(得分:0)
最简单的方法是使用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>
请注意,在棒棒糖之前,recycleview不会滚动。作为解决方案,在活动的oncreate中添加以下代码。
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;
}
这将确保仅在支持的设备上固定高度,并且在较旧的设备上显示完整的回收视图。
请告诉我是否还有更好的方法。
答案 9 :(得分:0)
您可以在xml代码中将任意高度设置为任意值,并将可见性设置为 gone 。然后,当您想对其进行充气时,将可见性设置为Java中的 Visible 。这是一个例子;
.xml
android:visibility="gone"
.java
recyclerView.setVisibility(View.VISIBLE);
答案 10 :(得分:0)
加上我的2美分,我需要一个具有最大高度和最小高度的回收器视图,并在2个之间包装内容
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/group_card_recycler_view_holder"
app:layout_constraintHeight_default="wrap"
app:layout_constraintHeight_max="@dimen/group_recycler_view_height"
app:layout_constraintHeight_min="@dimen/card_sentence_height"
android:layout_marginTop="@dimen/activity_horizontal_margin_8dp"
app:layout_constraintTop_toBottomOf="@id/group_name_container"
app:layout_constraintBottom_toTopOf="@id/myButtonLayout">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constrainedHeight="true"
android:id="@+id/group_card_recycler_view"/>
</androidx.constraintlayout.widget.ConstraintLayout>
答案 11 :(得分:0)
我也遇到了同样的问题,并且想分享一个新的最新答案。此版本至少适用于Android 9和Android Studio v。4.0。
将RecyclerView包装在ConstraintLayout中,如此处建议的一些答案所示。但是,您似乎无法在XML中设置该布局的最大高度。相反,您必须按如下所示在代码中进行设置:为ConstraintLayout设置一个ID,然后分别在有问题的活动或片段的onCreate或onViewCreated方法中-例如,将最大高度设置为200 dp:
findViewById<ConstraintLayout>(R.id.[YOUR ID]).maxHeight = 200 // activity
view.findViewById<ConstraintLayout>(R.id.[YOUR ID]).maxHeight = 200 // fragment
令人不安的是,ConstraintLayout 确实公开了XML属性android:minHeight
,但 no android:maxHeight
。
更烦人的是,RecyclerView本身显然带有名为android:maxHeight
的XML属性,但该属性不起作用。