我如何将RecyclerView的项目高度设置为屏幕高度的30%?
我不能简单地使用ConstraintLayout或PercentFrameLayout / PercentRelativeLayout,因为这些位置的子布局相对于父布局而言,其尺寸可能与屏幕不匹配。
最好,我希望以纯XML格式执行此操作(而不必使用任何Runnable来动态获取屏幕高度)。
编辑
需要澄清的是,由于许多解决方案都建议限制RecyclerView的高度,所以这并不是目的。 RecyclerView仍应填充屏幕。这就是我在说的,使用屏幕宽度(而不是高度):
想法是使卡的宽度为屏幕宽度的33%,同时保持RecyclerView的宽度在水平滚动超过屏幕时保持不变。
答案 0 :(得分:17)
据我所知,没有办法在XML中执行此操作。但是,您可以通过设置Runnable
的{{1}}的{{1}}在Java中(不包含任何ViewHolder
等),然后再返回itemView
适配器的LayoutParams
方法:
ViewHolder
答案 1 :(得分:7)
您可以覆盖indexOf
使用的LayoutManager
方法之一来强制使用特定大小:
RecyclerView
这是为了让您的recyclerView.setLayoutManager(new LinearLayoutManager(this){
@Override
public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
// force height of viewHolder here, this will override layout_height from xml
lp.height = getHeight() / 3;
return true;
}
});
适合屏幕。
答案 2 :(得分:3)
不能仅通过XML设置项目的百分比高度。原因是 在运行时会被夸大的项目,它不是像 布局。用XML编写的内容。
所以现在我告诉您两种实现百分比/体重的方法
第一种首选方法是在onCreateViewHolder()
内的Adapter
方法中覆盖高度
private int height = 0; // declared height globally in Adapter class to reuse it.
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
if (height == 0)
height = (int) (parent.getMeasuredHeight() * .3);
itemView.setMinimumHeight(height);
return new ItemViewHolder(itemView);
}
第二黑客可以使用SDP库。
在sdp
中用_160sdp
表示的XML中项目的高度。它不会为您提供30%的准确结果。但是它可以根据屏幕进行调整。
答案 3 :(得分:2)
DisplayMetrics displayMetrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int devicewidth = (int) (displayMetrics.widthPixels * 0.8);
view.getLayoutParams().width = devicewidth;
return new YourAdapter.ViewHolder(view);
答案 4 :(得分:1)
您可以使用展示广告指标
在构造函数中定义显示指标,或使用任何其他静态方法初始化。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
现在您可以在 onCreateViewHolder()
中使用它View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
//setting the height programmatically
itemView.getLayoutParams().height = metrics.heightPixels/3;
itemView.requestLayout();
或者您可以在布局的父布局的 onBindViewHolder()中使用。
答案 5 :(得分:0)
我是通过在自定义RecyclerView项布局中执行以下操作来实现这一点的:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val newMeasuredWidth =
(MeasureSpec.getSize(widthMeasureSpec) * WIDTH_ADJUSTMENT_RATIO).toInt()
super.onMeasure(
MeasureSpec.makeMeasureSpec(newMeasuredWidth, MeasureSpec.EXACTLY),
heightMeasureSpec
)
}
答案 6 :(得分:0)
尝试这种方式。一次
inner class MyFeatureProductViewHolder(val v: View) : RecyclerView.ViewHolder(v) {
val tvName = v.findViewById<TextView>(R.id.tvName)
val tvPrice = v.findViewById<TextView>(R.id.tvPrice)
val tvItemUploadTime = v.findViewById<TextView>(R.id.tvItemUploadTime)
val ivItem = v.findViewById<ImageView>(R.id.ivItem)
init {
v.layoutParams.width = itemView.measuredWidth - 20
v.requestLayout()
}
}
答案 7 :(得分:0)
如果您不介意确切的百分比,可以通过设置android:paddingLeft
和android:paddingRight
并将android:clipToPadding
设置为false
来获得所需的视图。
这也使第一个和最后一个项目在中心对齐。
答案 8 :(得分:-2)
好吧,我只是想解决您遇到的问题。我玩的很少。步骤如下:
那里发生了什么?
recyclerHolder
的屏幕高度恰好是屏幕高度的30%。
在recyclerHolder
内,我们RecyclerView
占据了父级所有30%的高度并采用了全宽。
ListItem Layout
占据父级的完整高度和宽度,其中父级是RecyclerView
,其正好具有30%的屏幕高度。
我尝试了这一点,并且效果很好。在那里,您可以找到2个空视图,仅用于测试它们是否完全适合顶部和底部,结果是的。将任何内容放入列表项,它将占据屏幕高度的30%。