Android之GridLayoutManager.setSpanSizeLookup问题

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)
发布了1096 篇原创文章 · 获赞 717 · 访问量 320万+

猜你喜欢

转载自blog.csdn.net/u011068702/article/details/105693517