2016-02-05 79 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中,它不會添加空格

相關問題