RecyclerView高度隨Item自適應 GridLayoutManager和LinearLayoutManager都適用

來源:互聯網
上載者:User

標籤:布局

ScrollView嵌套RecyclerView時,android:layout_height=”wrap_content”並不起作用,RecyclerView會填充剩餘的整個螢幕空間,也就相當於android:layout_height=”match_parent”,通過重寫GridLayoutManager或LinearLayoutManager 的onMeasure方法進行可重設RecyclerView的高度。

這裡只給出GridLayoutManager的例子,LinearLayoutManager類似

a.設定LayoutManager

rvPhotos.setLayoutManager(new PhotoLayoutManage(this, 3));

b.RecyclerView的Adapter
Adapter中定義變數item中的height

private int itemHeight;public int getItemHeight(){ return itemHeight;}

在Adapter的ViewHolder構造方法中設定item項顯示後的高度

itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {                @Override                public boolean onPreDraw() {                    itemHeight=convertView.getMeasuredHeight();                    return true;                }            });

c.自訂GridLayoutManager重寫onMeasure方法

public class PhotoLayoutManage extends GridLayoutManager{        // RecyclerView高度隨Item自適應        public PhotoLayoutManage(Context context,int spanCount) {            super(context,spanCount);        }        @Override        public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, final int widthSpec,final int heightSpec) {            try {                 //不能使用   View view = recycler.getViewForPosition(0);                 //measureChild(view, widthSpec, heightSpec);                  // int measuredHeight  view.getMeasuredHeight();  這個高度不準確                    if(adapter!=null&&adapter.getItemHeight()>0) {                                               int measuredWidth = View.MeasureSpec.getSize(widthSpec);                        int measuredHeight = adapter.getItemHeight()+rvPhotos.getPaddingBottom()+rvPhotos.getPaddingTop();                        int line = adapter.getItemCount() / getSpanCount();                        if (adapter.getItemCount() % getSpanCount() > 0) line++;                        setMeasuredDimension(measuredWidth, measuredHeight * line);                    }else{                        super.onMeasure(recycler,state,widthSpec,heightSpec);                    }            }catch (Exception e){                super.onMeasure(recycler,state,widthSpec,heightSpec);            }        }    }

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

RecyclerView高度隨Item自適應 GridLayoutManager和LinearLayoutManager都適用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.