Android GridLayoutManager.setSpanSizeLookup problem

1 question

Using BaseMultiItemQuickAdapter to load multiple layouts with recycleView, it is necessary to realize that some views display one line and some lines display multiple pictures.

Load different layouts according to the type in the 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);
    }

Then during initialization, we need to use gridLayoutManager.setSpanSizeLookup to determine the number of lines displayed in each type, and understand the error at the beginning. The code is as follows

         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);

I initialized the GridLayoutManager here with 4 lines per line, and then wrote out that the picture occupies one line, instead of displaying 4 lines per line, it is wrong to return here

GridLayoutManager (this, 4), which means that a row needs 4 pads, and then returns 1 below, indicating that it only takes 1/4, and the picture returns 4/4, so it occupies a row, as long as the other way round.

 

 

 

 

 

2 Solution

         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);

In this way, the picture returns 1, indicating that it only occupies 1/4, and then the head occupies 4/4, indicating that one line is displayed, no problem, and also note that we are initializing a line of 4, if the returned data is greater than this number, it will The following error is reported, so it cannot return greater than 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 original articles published · 717 praised · 3.2 million views

Guess you like

Origin blog.csdn.net/u011068702/article/details/105693517