Android中RecyclerView如何实现自动换行

Posted kaolagirl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中RecyclerView如何实现自动换行相关的知识,希望对你有一定的参考价值。

在项目中是要经常使用到RecyclerView的,在没写这篇文章之前,我往往都是使用 GridLayoutManager来实现一行显示多个item的布局,但是这种做法是非常不灵活的,因为item的个数是固定的,且不能随着其长短来自动换行,所以今天就来跟大家分享下如何实现自动换行!
参考博文【链接】

1. 自定义 LayoutManager

自定义一个MyLayoutManager类继承于LayoutManager,其代码如下:

/**
 * 自动换行布局管理
 * wang 2021/7/12
 */
public class MyLayoutManager extends RecyclerView.LayoutManager {
    @Override
    public RecyclerView.LayoutParams generateDefaultLayoutParams() {
        return new RecyclerView.LayoutParams(
                RecyclerView.LayoutParams.WRAP_CONTENT,
                RecyclerView.LayoutParams.WRAP_CONTENT);
    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
//        super.onLayoutChildren(recycler, state);
        detachAndScrapAttachedViews(recycler);
        int sumWidth = getWidth();

        int curLineWidth = 0, curLineTop = 0;
        int lastLineMaxHeight = 0;
        for (int i = 0; i < getItemCount(); i++) {
            View view = recycler.getViewForPosition(i);

            addView(view);
            measureChildWithMargins(view, 0, 0);
            int width = getDecoratedMeasuredWidth(view);
            int height = getDecoratedMeasuredHeight(view);

            curLineWidth += width;
            if (curLineWidth <= sumWidth) {//不需要换行
                layoutDecorated(view, curLineWidth - width, curLineTop, curLineWidth, curLineTop + height);
                //比较当前行多有item的最大高度
                lastLineMaxHeight = Math.max(lastLineMaxHeight, height);
            } else {//换行
                curLineWidth = width;
                if (lastLineMaxHeight == 0) {
                    lastLineMaxHeight = height;
                }
                //记录当前行top
                curLineTop += lastLineMaxHeight;

                layoutDecorated(view, 0, curLineTop, width, curLineTop + height);
                lastLineMaxHeight = height;
            }
        }
    }
}

2.使用

使用方式和平时使用recyclerview一样 ,在创建适配器时把布局替换 MyLayoutManager 即可

 MyLayoutManager layout = new MyLayoutManager();
 layout.setAutoMeasureEnabled(true);//防止recyclerview高度为wrap时测量item高度0(一定要加这个属性,否则显示不出来)
 searchHistory_rv.setLayoutManager(layout);
 goodSearchHistoryAdapter = new GoodSearchHistoryAdapter(this);
 searchHistory_rv.setAdapter(goodSearchHistoryAdapter);

以上是关于Android中RecyclerView如何实现自动换行的主要内容,如果未能解决你的问题,请参考以下文章

Android 中ViewPager嵌套RecyclerView出现滑动冲突的解决方案

Android——实现RecyclerView左侧滑删除与右侧滑选择

Android中RecyclerView如何实现自动换行

Android打造万能自定义阴影控件

Android 自定义ItemDecoration-实现分组吸顶效果

带有水平溢出的Android垂直recyclerview