編寫RecyclerView.ItemDecoration時,在onDraw方法中,Drawable的高度等於RecyclerView的高度減去RecyclerView的上下padding。
@Override public void onDraw(Canvas c, RecyclerView parent, State state) { int top = parent.getPaddingTop(); int bottom = parent.getHeight() - parent.getPaddingBottom(); int childCount = parent.getChildCount(); for(int i=0;i < childCount;i++){ View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams)child.getLayoutParams(); int left = child.getRight() + layoutParams.rightMargin; int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } }
但運行后的顯示效果卻和我的預期相差很大
可以看到,ItemDecoration高度竟然全屏了,然后檢查xml布局文件:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.xmy.recylerviewdemo.MainActivity" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="10.0dip" android:orientation="vertical" > <ImageView android:id="@+id/item_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="center" android:src="@drawable/img" android:adjustViewBounds="true"/> <TextView android:id="@+id/item_tv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
xml布局文件中RecyclerView和Item的高度都設定的是wrap_content,那說好的自適應於item高度呢?查看Android文檔,沒發現有關RecyclerView高度相關說明,看來只能自己動手豐衣足食了。
根據Android-RecylerView初識里 提到的,RecyclerView並不負責Item的顯示工作,而Adapter負責的是數據倉庫和Item的視圖,所以最終把目標鎖定到 RecyclerView.LayoutManager上。於是嘗試繼承LinearLayoutManager,發現果然有onMeasure方法:
public void onMeasure(Recycler recycler, State state, int widthSpec,int heightSpec)