2016-02-05 52 views
12

Current View is 如何设置的项目行的高度GridLayoutManager

我的回收站项目,其在膨胀onCreateViewHolder

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:padding="16dp"> 

    <ImageView 
     android:id="@+id/gridListImageView" 
     android:layout_width="96dp" 
     android:layout_height="96dp" 
     android:src="@drawable/a" /> 

    <TextView 
     android:id="@+id/gridListView_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dp" 
     android:text="Large Text" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 
</LinearLayout> 

I want to display something like this 其中有回收器查看一半高度的一排? 并添加填充空间的其余部分? 我可以通过GridLayoutManager做到这一点吗?

这是我GridLayoutManager

 GridLayoutManager glm = new GridLayoutManager(getActivity(), 2); 
     recyclerView.setLayoutManager(glm); 
+0

如果您为'RecyclerView'设置了特定的高度,则可以将其设置为LinearLayout的一半高度。如果没有,例如如果你想要一个项目的屏幕高度的一半,你必须以编程方式,获得屏幕高度,做一些计算和设置LayoutParams。 – yennsarah

+0

你必须计算屏幕高度 - 减去导航栏的高度,然后用2除以得到一排的高度 –

+0

为什么不用LinearLayout尝试,使用weightSum会很容易 –

回答

37

充气时在适配器你的意见的布局,您可以通过编程设置自己的身高。为了评估适当的使用高度,你可以依赖父ViewGroup(这就是RecyclerView本身)。这是一个样本:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = mLayoutInflater.inflate(R.layout.view_item, parent, false); 
    // work here if you need to control height of your items 
    // keep in mind that parent is RecyclerView in this case 
    int height = parent.getMeasuredHeight()/4; 
    itemView.setMinimumHeight(height); 
    return new ItemViewHolder(itemView);   
} 

希望这可以帮助。

+0

这正是我想要的..谢谢! – Meet

+0

@Meet很高兴我可以帮助! :) – thetonrifles

+0

你好@thetonrifles,我已经试过你的示例代码,但看起来不能帮助我'(这种情况下)'[http://stackoverflow.com/questions/41338627/set-height-gravity-of-span-item -in-gridlayoutmanager],我不知道为什么。请帮我看看。谢谢, –

3

某时,获取适配器中的充气视图大小返回0或负值。另一种方法是从适配器外侧获取所需的尺寸,操作并将其放入视图中。在我的情况下,另一个问题是大小设置无效。所以我使用的布局参数

此处设置的大小设置我的适配器活动:

Display display = MainActivity.this.getWindowManager().getDefaultDisplay(); 
        Point size = new Point(); 
        display.getSize(size); 
        int y = size.y; 
        y=(int)y/2; 
GridLayoutManager linearLayoutManager = new GridLayoutManager(MainActivity.this,2); 
        recyclerView.setLayoutManager(linearLayoutManager); 
        NewOrderAdapter newOrderAdapter=new NewOrderAdapter(MainActivity.this,arrayListname,arrayListimage,y); 
        recyclerView.setAdapter(newOrderAdapter); 

和我这样设置视图大小:

@Override 
    public myviewholder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = inflator.inflate(R.layout.new_order_row, viewGroup, false); 
     GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams(); 
     params.height = ysize; 
     view.setLayoutParams(params); 
     myviewholder holder = new myviewholder(view); 
     return holder; 
    } 

不要忘记设置高度布局在您的布局初始化

1

在最近的API级别目前25 onCreateViewHolder 回收站的高度始终为空。此片段将在调用回收器视图的onMeasure 后设置高度,并将正确的高度设置为充气列表视图。

@Override 
public DataBindingViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 
    // You may inflate your view here. 
    parent.post(new Runnable() { 

     @Override 
     public void run() { 
      int height = parent.getMeasuredHeight()/rows; 
      View view = holder.getBinding().getRoot(); 
      view.getLayoutParams().height = height; 
     } 
    }); 
    return holder; 
} 
+0

很好的解决方案,但有2个问题: 1)如何确保在runnable运行时调用onMeasure? 2)什么是DataBindingViewHolder? –

3

由于支持库25.1.0,thetonrifles答案不起作用。我建议下面的修改:

public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
     GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) v.getLayoutParams(); 
     lp.height = parent.getMeasuredHeight()/4; 
     v.setLayoutParams(lp); 
     return new ViewHolder(v); 
    } 
+0

不起作用,lp.height仍然返回0。 – Kamajabu

2

这是我的代码,根据实际的长宽比要求调整回收视图元素的高度。

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.adapter_offers, parent, false); 

    int width = parent.getMeasuredWidth(); 
    float height = (float) width/Config.ASPECT_RATIO;//(Width/Height) 
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams(); 
    params.height = Math.round(height); 
    itemView.setLayoutParams(params); 
    return new MyViewHolder(itemView); 
} 
0

您不需要设置项目的高度。这里的问题是图像试图填充所有的空间。只需将 android:adjustViewBounds="true"添加到ImageView中,它不会添加空格

相关问题