1 问题
利用BaseMultiItemQuickAdapter,用recycleView加载多布局,需要实现有些view显示一行,有些一行显示多个图片。
在BaseMultiItemQuickAdapter适配器里面根据类型加载不同布局。
public ImageMultiItemAdapter(List<MultiItemEntity> data) {
super(data);
addItemType(ITEM_HEAD_TYPE, R.layout.item_favorite_header);
addItemType(ITEM_IMAGE_TYPE, R.layout.item_imge_content);
}
然后在初始化的时候,我们需要用到gridLayoutManager.setSpanSizeLookup,来更具类型来判断每行显示的个数,一开始理解错误,代码如下
imageMultiItemAdapter = ImageMultiItemAdapter(newDatas)
recycleview.setAdapter(imageMultiItemAdapter);
currentCounter = imageMultiItemAdapter!!.getItemCount()
imageMultiItemAdapter!!.setClickListener(this)
var gridLayoutManager = GridLayoutManager(this, 4)
var hashMap = hashMapOf(RecyclerViewSpacesItemDecoration.TOP_DECORATION to 2, RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION to 2, RecyclerViewSpacesItemDecoration.LEFT_DECORATION to 2, RecyclerViewSpacesItemDecoration.RIGHT_DECORATION to 2)
recycleview.addItemDecoration(RecyclerViewSpacesItemDecoration (hashMap));
gridLayoutManager.setSpanSizeLookup(object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
when(imageMultiItemAdapter!!.getItemViewType(position)) {
ImageMultiItemAdapter.ITEM_HEAD_TYPE -> return 1
ImageMultiItemAdapter.ITEM_IMAGE_TYPE -> return 4
else -> return 1
}
}
})
recycleview.setLayoutManager(gridLayoutManager);
imageMultiItemAdapter!!.setOnLoadMoreListener(this, recycleview);
我这里初始化GridLayoutManager是一行4个,然后写出来发现图片占用一行了,不是一行显示4个,是这里返回搞错了,
GridLayoutManager(this, 4),表示一行需要4个填充,然后下面返回1,说明只占用1/4,图片返回4/4,所以占一行了,只要反过来就行。
2 解决办法
imageMultiItemAdapter = ImageMultiItemAdapter(newDatas)
recycleview.setAdapter(imageMultiItemAdapter);
currentCounter = imageMultiItemAdapter!!.getItemCount()
imageMultiItemAdapter!!.setClickListener(this)
var gridLayoutManager = GridLayoutManager(this, 4)
var hashMap = hashMapOf(RecyclerViewSpacesItemDecoration.TOP_DECORATION to 2, RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION to 2, RecyclerViewSpacesItemDecoration.LEFT_DECORATION to 2, RecyclerViewSpacesItemDecoration.RIGHT_DECORATION to 2)
recycleview.addItemDecoration(RecyclerViewSpacesItemDecoration (hashMap));
gridLayoutManager.setSpanSizeLookup(object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
when(imageMultiItemAdapter!!.getItemViewType(position)) {
ImageMultiItemAdapter.ITEM_HEAD_TYPE -> return 4
ImageMultiItemAdapter.ITEM_IMAGE_TYPE -> return 1
else -> return 1
}
}
})
recycleview.setLayoutManager(gridLayoutManager);
imageMultiItemAdapter!!.setOnLoadMoreListener(this, recycleview);
这样,图片返回1个,说明只占用1/4,然后头部占用4/4,说明显示一行,没毛病,还要注意,初始化我们是一行4个,如果返回的数据大于这个数,就会报以下错误,所以不能返回大于4.
04-22 11:45:33.270 5041 5041 E AndroidRuntime: java.lang.IllegalArgumentException: Item at position 1 requires 4 spans but GridLayoutManager has only 1 spans.
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:553)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6960)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6960)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6960)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6960)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.View.measure(View.java:23627)
04-22 11:45:33.270 5041 5041 E AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6960)