標籤:布局
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都適用