快速实现RecycleView的网格和瀑布流布局添加头部(尾部原理一样,故略之)

本文介绍了如何在RecycleView中利用GridLayoutManager和StaggeredGridLayoutManager添加头部。通过继承GridLayoutManager.SpanSizeLookup和使用StaggeredGridLayoutManager.LayoutParams.setFullSpan(true),实现头部占满列数的效果。RecycleView的高度解耦和灵活性使得添加头部变得可能,尽管没有内置的addHeader方法,但可以通过自定义实现。文章还提供了示例代码和Demo下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RecycleView高度的解耦,非常灵活,通过布局管理器LayoutManager控制其显示的布局;通过ItemDecoration控制Item间的间隔;通过ItemAnimator控制Item增删的动画;不过需要自己写接口实现点击、长按事件。它只管回收与复用View。
然后最坑爹的是没了addHeader和addFooter,需要自己实现(怨念中…),自己找开源的代码发现稍微有点繁琐,于是自己动手研究利用Manager的特性还有LayoutParams实
现了添加头尾等操作,接下来介绍GridLayoutManager和StaggeredGridLayoutManager怎么添加头部,LinearLayout太简单了就不介绍了。

①GridLayoutManager添加头部操作
网格布局配置:
关键在于继承GridLayoutManager.SpanSizeLookup实现HeaderSpanSizeLookup来处理指定位置占多少列的操作来实现添加头部

GridLayoutManager glm = new GridLayoutManager(this, 2);
        glm.setSpanSizeLookup(new HeaderSpanSizeLookup(glm));
        recyclerView.setLayoutManager(glm);
        recyclerView.addItemDecoration(new SpacesItemDecoration(5));
        recyclerView.setAdapter(new LayoutAdapter());

HeaderSpanSizeLookup 在getSpanSize方法这里通过position=0来设置该位置的view占满getSpanCount即我们设置的两列

    class HeaderSpanSizeLookup extends GridLayoutManager.SpanSizeLookup {
   

        private final GridLayoutManager layoutManager;

        public HeaderSpanSizeLookup(GridLayoutManager layoutManager) {
            this.layoutManager = layoutManager;
        }

        @Override
        public int getSpanSize(int position) {
            position = position == 0 ? layoutManager.getSpanCount() : 1;
            return position;
        }

    }

LayoutAdapter 的实现跟瀑布流的大同小异,细节注释去看下面的瀑布流即可

class LayoutAdapter extends RecyclerView.Adapter<LayoutAdapter.SimpleViewHolder> {

        private static final int TYPE_HEADER = 1, TYPE_ITEM = 2;

        class SimpleViewHolder extends RecyclerView.ViewHolder {
            ImageView header;
            ImageView item;

            public SimpleViewHolder(View view) {
                super(view);
                header = (ImageView) view.findViewById(R.id.iv_header);
                item = (ImageView) view.findViewById(R.id.iv_item);
            }
        }

        @Override
        public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = null;
            switch (viewType) {
                case TYPE_HEADER:
                    view = LayoutInflater.from(GridLayoutManagerActivity.this).inflate(R.layout.header, parent, false);
                    break;
                case TYPE_ITEM:
                    view = LayoutInflater.from(GridLayoutManagerActivity.this).inflate(R.layout.item, parent, false);
                    break;
            }
            return new SimpleViewHolder(view);
        }

        int size[] = new int[2];

        @Override
        public void onBindViewHolder(final SimpleViewHolder holder, int position) {

            switch (holder.getItemViewType()) {
                case TYPE_HEADER:
                    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) holder.header.getLayoutParams();
                    size = getImageRealSize(R.drawable.ic_girls_banner);
                    lp.width = metrics.widthPixels;
                    lp.height = lp.width * size[1] / size[0];

                    holder.header.setLayoutParams(lp);

                    Glide.with(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值