RecyclerView项目中的Android屏幕宽度百分比

时间:2018-07-06 00:12:16

标签: android android-recyclerview android-constraintlayout

我如何将RecyclerView的项目高度设置为屏幕高度的30%?

我不能简单地使用ConstraintLayout或PercentFrameLayout / PercentRelativeLayout,因为这些位置的子布局相对于父布局而言,其尺寸可能与屏幕不匹配。

最好,我希望以纯XML格式执行此操作(而不必使用任何Runnable来动态获取屏幕高度)。

编辑

需要澄清的是,由于许多解决方案都建议限制RecyclerView的高度,所以这并不是目的。 RecyclerView仍应填充屏幕。这就是我在说的,使用屏幕宽度(而不是高度):

enter image description here

想法是使卡的宽度为屏幕宽度的33%,同时保持RecyclerView的宽度在水平滚动超过屏幕时保持不变。

9 个答案:

答案 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:paddingLeftandroid:paddingRight并将android:clipToPadding设置为false来获得所需的视图。 这也使第一个和最后一个项目在中心对齐。

答案 8 :(得分:-2)

好吧,我只是想解决您遇到的问题。我玩的很少。步骤如下:

  1. MainActivity View,其中RecyclerView的高度恰好是屏幕高度的30%。 enter image description here
  2. 回收者视图项目的高度和宽度必须为match_parent。 enter image description here

那里发生了什么?

  1. recyclerHolder的屏幕高度恰好是屏幕高度的30%。

  2. recyclerHolder内,我们RecyclerView占据了父级所有30%的高度并采用了全宽。

  3. ListItem Layout占据父级的完整高度和宽度,其中父级是RecyclerView,其正好具有30%的屏幕高度。

我尝试了这一点,并且效果很好。在那里,您可以找到2个空视图,仅用于测试它们是否完全适合顶部和底部,结果是的。将任何内容放入列表项,它将占据屏幕高度的30%。