首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调整和定位RecyclerView项的大小

调整和定位RecyclerView项的大小
EN

Stack Overflow用户
提问于 2019-05-19 18:53:04
回答 3查看 4.2K关注 0票数 2

我正在使用RecyclerView在网格布局中显示项目。下面是模拟器的图像和我需要达到的期望结果。左侧(正在执行)图像是我模拟器上的输出,而右侧(所需)是我想要实现的输出。

活动布局XML

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/parentLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#d3c3c3">

 <include
    android:id="@+id/toolBarIncluded"
    layout="@layout/toolbar_new_layout" />


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolBarIncluded"
    android:orientation="vertical"
    android:weightSum="1">

    <RelativeLayout

        android:id="@+id/recyclerAdView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:layout_weight="0.65"
        android:background="#009688" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/recyclerAdView"
        android:layout_gravity="center"
        android:layout_weight="0.35"
        android:background="#00000000"
        android:gravity="center">

        <android.support.v7.widget.RecyclerView

            android:id="@+id/recyclerGridView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:background="#00000000"
            android:foregroundGravity="center" />

    </RelativeLayout>

</LinearLayout>

列表项XML

代码语言:javascript
复制
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/llGridItemLayout"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:layout_margin="6dp"
 android:background="@drawable/drawable_grid_item_background"
 android:gravity="center"
 android:paddingStart="2dp"
 android:paddingEnd="2dp"
 android:orientation="vertical">

 <ImageView
    android:id="@+id/ivItemIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="fitCenter"
    android:src="@drawable/ic_new_receipt_wrong" />

  <TextView
    android:layout_marginTop="6dp"
    android:id="@+id/tvItemName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:lines="1"
    android:text="My Complaints"
    android:textSize="14sp" />

 </LinearLayout>

活动代码片段

代码语言:javascript
复制
    gridLayoutManager = new GridLayoutManager(MainActivity.this, 3);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(gridLayoutManager);
    recyclerView.setAdapter(demoDashAdapter);

适配器代码段

代码语言:javascript
复制
int viewHeight ,viewWidth ;
public onCreateViewHolder(){
   viewHeight = viewGroup.getMeasuredHeight() / 4;
   viewWidth = viewGroup.getMeasuredWidth() / 3;
  ...
}

public onBindViewHolder(){

  viewHolder.itemLayout.setMinimumWidth(viewWidth);
  viewHolder.itemLayout.setMinimumHeight(viewHeight);
  ...
}

因此,我这里的问题是,如何动态调整recyclerView中的项的大小。请注意,我对weightSum 1使用布局权重为0.65和0.35;

请给我引路。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-19 19:12:02

为什么选择viewHeight = viewGroup.getMeasuredHeight() / 4

如果你想显示3行,只需除以3即可。还要考虑到你在item.xml中拥有的利润

因此,获取一行中每一项的高度应该是这样的:

代码语言:javascript
复制
(viewGroup.getMeasuredHeight()/3) - (marginTop + marginBot)
票数 1
EN

Stack Overflow用户

发布于 2019-05-19 19:16:29

不要使用RecyclerView.Adapter来改变视图的布局。这是RecyclerView.LayoutManager的责任。

您可以重写验证View.LayoutParams的方法以均匀分布大小:

代码语言:javascript
复制
 //customized GridLayoutManager
 gridLayoutManager = new GridLayoutManager(MainActivity.this, 3){
     @Override
     public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
         // force size of viewHolder here, this will override layout_height and layout_width from xml
         lp.height = getHeight() / getSpanCount();
         lp.width = getWidth() / getSpanCount();
         return true;
     }
 };
 recyclerView.setHasFixedSize(true);
 recyclerView.setLayoutManager(gridLayoutManager);
票数 4
EN

Stack Overflow用户

发布于 2019-05-19 19:10:17

您可以尝试在onCreateViewHolder中使用LayoutParams来实现这一点,如下所示:

代码语言:javascript
复制
  public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View rowLayout = LayoutInflater.from(context).inflate(R.layout.row, parent, false);
    ViewGroup.LayoutParams layoutParams = rowLayout.getLayoutParams();
    layoutParams.height = (int) (parent.getHeight() * 0.15); // control the recyclerView row height from here
    rowLayout.setLayoutParams(layoutParams);
    return new Holder(rowLayout);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56207068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档