RecyclerView网格布局设置空白布局

关于RecyclerView设置空白布局,网上已经有不少大神有总结了,如:关于RecyclerView如何设置空布局(setEmptyView)的几种方式总结了设置空白布局的几种方式。作者本次是在通过修改Adapter的这个方式基础上讲的。

正如关于RecyclerView如何设置空布局(setEmptyView)的几种方式文章中介绍的设置空白布局的方式,只适用于列表布局,如果是网格布局则不适用了。
网格布局需要在列表布局设置空白布局的基础上设置setSpanSizeLookup()这个方法,对条目占据的分数进行处理。
先看一下,列表布局设置空白布局的步骤。
列表布局设置空白布局的设置均在adapter中。

1、重写getItemViewType方法

根据是否有数据返回不同的viewType。

	private static final int VIEW_TYPE_EMPTY = -1;
    private static final int VIEW_TYPE_ITEM = 0;
    ......
    @Override
    public int getItemViewType(int position) {
        return (mData == null || mData.isEmpty()) ? VIEW_TYPE_EMPTY : VIEW_TYPE_ITEM;
    }

2、在getItemCount方法中无数据时返回1。

    @Override
    public int getItemCount() {
        return (mData == null || mData.isEmpty()) ? 1 : mData.size();
    }

没有数据时,返回1个条目,用于展示空白布局。

3、在onCreateViewHolder方法中根据viewType返回空白布局的ViewHolder及有数据的ViewHolder。

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == VIEW_TYPE_EMPTY) {
            return getEmptyViewHolder(parent);
        }
        return getViewHolder(parent, viewType);
    }

4、如果需要对空白布局进行操作,则在onBindViewHolder方法中进行逻辑处理。

例如

	@Override
    public void onBindViewHolder(@NonNull BaseRecyclerViewAdapter.ViewHolder holder, final int position) {
        ......
        int viewType = getItemViewType(position);
        //增加viewType类型的判断
        if(viewType == VIEW_TYPE_EMPTY) {
            holder.setData(null, position);
            return;
        }
        if(mData == null || mData.isEmpty()) {
            return;
        }
        ......
    }

5、在getEmptyViewHolder方法中返回空白局部的ViewHolder。

经过以上设置后,列表布局数据为空时,即可展示空白布局。但是如果是网格布局,空白布局只会占据页面宽度的1/n(n为设置的spanCount),没有达到预期效果。
这时候需要设置setSpanSizeLookup方法,对条目占据的分数进行处理。

6、GridLayoutManager设置setSpanSizeLookup处理条目占据的分数问题。

		//设置layoutManager
        GridLayoutManager manager = new GridLayoutManager(mContext, SPAN_COUNT, RecyclerView.VERTICAL, false);
        rv_list.setLayoutManager(manager);
        //设置空白数据时,空白布局占据的spanCount
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int viewType = rv_list.getAdapter().getItemViewType(position);
                if(viewType == -1) {
                    return SPAN_COUNT;
                }
                return 1;
            }
        });

这样设置后,就可以达到空白布局长度和宽度match_parent的效果。

附:
1、参考demo:
Github Demo
2、参考文章:关于RecyclerView如何设置空布局(setEmptyView)的几种方式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以使用RecyclerView.ItemDecoration类来设置RecyclerView网格布局的行间距。具体实现方法如下: ```java public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { private int spanCount; private int spacing; private boolean includeEdge; public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { this.spanCount = spanCount; this.spacing = spacing; this.includeEdge = includeEdge; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // item position int column = position % spanCount; // item column if (includeEdge) { outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing) outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) if (position < spanCount) { // top edge outRect.top = spacing; } outRect.bottom = spacing; // item bottom } else { outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing) outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) if (position >= spanCount) { outRect.top = spacing; // item top } } } } ``` 在上述代码中,我们可以通过设置spacing参数来控制行间距的大小。如果includeEdge参数为true,则表示需要在每行的左右两端也设置间距,否则只在中间的格子之间设置间距。 使用方法如下: ```java int spanCount = 3; // 一行显示3个格子 int spacing = 20; // 行间距为20px boolean includeEdge = false; // 不在左右两端设置间距 recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge)); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值