2017-03-09 241 views
4

我想設置RecylerView的最大高度。我可以使用下面的代碼設置最大高度。下面的代碼使高度爲當前屏幕的60%。如何設置RecyclerView的最大高度

 DisplayMetrics displaymetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int a = (displaymetrics.heightPixels * 60)/100; 
    recyclerview1.getLayoutParams().height = a; 

但現在的問題是,如果它沒有項目,那麼它的高度是60%。 所以我想設置它的高度0,當它沒有項目。

我想達到的東西。

if(recyclerview's height > maxHeight) 
then set recyclerview's height to maxHeight 
    else dont change the height of recyclerview. 

我該如何設置? 請幫助我,我堅持了下來

+0

你有沒有找到這方面的解決方案? –

+0

[如何在android中設置包裝內容的最大高度?](https://stackoverflow.com/questions/18425758/how-to-set-a-maximum-height-with-wrap-content-in -android) – user1506104

回答

10

這是你需要的東西。子類RecyclerView並覆蓋onMeasure如下:

@Override 
protected void onMeasure(int widthSpec, int heightSpec) { 
    heightSpec = MeasureSpec.makeMeasureSpec(Utils.dpsToPixels(240), MeasureSpec.AT_MOST); 
    super.onMeasure(widthSpec, heightSpec); 
} 

確保,你給像素爲makeMeasureSpec()第一個參數的適當數量。我個人需要RecyclerView,最多240dps。

+0

這救了我的命,謝謝! –

+0

請問您是如何對RecyclerView進行分類的? – Dusan

+1

@Dusan創建了一個新類,即擴展了RecyclerView。 – Fattum

2

寫這個語句中的if else ,讓我知道,

ViewGroup.LayoutParams params=recyclerview.getLayoutParams(); 
params.height=100; 
recyclerview.setLayoutParams(params); 
+0

如果你還在談論什麼? – Maulik009

+0

>設置其高度爲0時,沒有任何項目,你可以確定這個?@ Maulik009,在那個地方。是@Piyush,bhai :) – Radhey

+0

你沒有得到正確的問題。 – Maulik009

0

您可以在RecyclerView使用WRAP_CONTENT。它會根據其內容自動衡量您的回收站。

您還可以計算當前高度並設置最大高度。所以Recyclerview將使用wrap_content屬性值直到最大高度。

public static void getTotalHeightofRecyclerView(RecyclerView recyclerView) { 

     RecyclerView.Adapter mAdapter = recyclerView.getAdapter(); 

     int totalHeight = 0; 

     for (int i = 0; i < mAdapter.getItemCount(); i++) { 
      View mView = recyclerView.findViewHolderForAdapterPosition(i).itemView 

      mView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 

      totalHeight += mView.getMeasuredHeight(); 
     } 

     if (totalHeight > 100) { 
      ViewGroup.LayoutParams params = recyclerView.getLayoutParams(); 
      params.height = 100; 
      recyclerView.setLayoutParams(params); 
     } 
    } 
+0

我一直在佈局中保留了wrap_content。但是我想設置它的最大高度,以便它只能在當前屏幕上滾動。因爲我有下面的按鈕,我總是想顯示。 – Maulik009

+0

我在運行時通過計算更新了答案。 – mertsimsek

+0

引起:顯示java.lang.NullPointerException:嘗試從字段「android.view.View android.support.v7.widget.RecyclerView $ ViewHolder.itemView」上讀取空對象引用上線 ERR 查看MVIEW = recyclerView。findViewHolderForAdapterPosition(i).itemView – Maulik009

1

我們可以優化@Fattum的方法。 我們可以使用app:maxHeight來設置maxHeight。你可以使用dp或px。

public class MaxHeightRecyclerView extends RecyclerView { 
    private int mMaxHeight; 

    public MaxHeightRecyclerView(Context context) { 
     super(context); 
    } 

    public MaxHeightRecyclerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initialize(context, attrs); 
    } 

    public MaxHeightRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     initialize(context, attrs); 
    } 

    private void initialize(Context context, AttributeSet attrs) { 
     TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView); 
     mMaxHeight = arr.getLayoutDimension(R.styleable.MaxHeightScrollView_maxHeight, mMaxHeight); 
     arr.recycle(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if (mMaxHeight > 0) { 
      heightMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxHeight, MeasureSpec.AT_MOST); 
     } 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

值/ attrs.xml

<declare-styleable name="MaxHeightScrollView"> 
    <attr name="maxHeight" /> 
</declare-styleable> 
+0

其不工作 –

+0

@VikashParajuli你能分享你的代碼嗎 –

0

這是一個有趣的方式,在我的情況下工作。我裹着我的RecyclerView兩個視圖之間配重等於1,則封閉整個事情的LinearLayout中,像這樣:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 
    <android.support.v7.widget.RecyclerView 
     android:scrollbars="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     /> 
    <View 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 
</LinearLayout> 

不要忘記使用android:layout_height="wrap_content"爲您RecyclerView。

相關問題