android:RecyclerView布局管理显示不同跨度和空布局

布局管理器显示不同跨度:

实用RecyclerView必须设置一个布局管理器,这里设置GridLayoutManager,还需要给布局管理器设置一个方法;

 

 //设置表格,根据position计算在该position处item的跨度(占几列数据)
        layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                //计算在哪个position更换跨度,要占满一行跨度就是2
                if (position < type1Names.length)
                    return 2;
                else //不需要占满一行跨度就是1
                    return 1;
            }
        });

适配器:

 

 

public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final MainActivity context;
    private final List<TypeBean> typeBeanList;
    private final int breakPoint;

    public MyRecyclerAdapter(MainActivity mainActivity, List<TypeBean> typeBeanList, int breakPoint) {
        this.context = mainActivity;
        this.typeBeanList = typeBeanList;
        this.breakPoint = breakPoint;
    }

    @Override
    //判断是加载那个布局
    public int getItemViewType(int position) {
        if (position < breakPoint) {
            return 0;
        } else {
            return 1;
        }
    }

    @Override
    //返回一个自定义的ViewHolder(当RecyclerView需要一个ViewHolder时会回调该方法,如果有可复用的View不会回调)
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        RecyclerView.ViewHolder holder = null;
        switch (viewType) {
            case 0:
                view = LayoutInflater.from(context).inflate(R.layout.item_recycler_type1, parent, false);
                holder = new Type1ViewHolder(view);
                break;
            case 1:
                view = LayoutInflater.from(context).inflate(R.layout.item_recycler_type2, parent, false);
                holder = new Type2ViewHolder(view);
                break;
        }
        return holder;
    }

    @Override
    //当一个View需要出现在屏幕上时,该方法会被回调,我们需要再该方法中根据数据来更改视图
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        TypeBean typeBean = typeBeanList.get(position);

        switch (getItemViewType(position)) {
            case 0:
                Type1ViewHolder holder1 = (Type1ViewHolder) holder;
                holder1.tvName.setText(typeBean.getName());
                holder1.tvId.setText(typeBean.getId() + "");
                break;
            case 1:
                Type2ViewHolder holder2 = (Type2ViewHolder) holder;
                holder2.tvName.setText(typeBean.getName());
                holder2.tvId.setText(typeBean.getId() + "");
                if (position % 2 == 1)
                    holder2.fgxView.setVisibility(View.GONE);
                else
                    holder2.fgxView.setVisibility(View.VISIBLE);
                break;
        }
    }

    @Override
    //一共多少item
    public int getItemCount() {
        return typeBeanList.size();
    }

    //布局1
    public class Type1ViewHolder extends RecyclerView.ViewHolder {

        public TextView tvName, tvId;

        public Type1ViewHolder(View itemView) {
            super(itemView);
            tvName = itemView.findViewById(R.id.tv_name);
            tvId = itemView.findViewById(R.id.tv_id);
        }
    }

    //布局2
    public class Type2ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvName, tvId;
        public View fgxView;

        public Type2ViewHolder(View itemView) {
            super(itemView);
            tvName = itemView.findViewById(R.id.tv_name);
            tvId = itemView.findViewById(R.id.tv_id);
            fgxView = itemView.findViewById(R.id.fgx_view);
        }
    }

}

当adapter没有内容时,需要显示一个“空布局”页面,现在很多项目中都会用到;以前是根据数据是否为null来显示隐藏RecyclerView和空布局,其实可以自己封装一下,在RecyclerView中添加一个方法即可:

 

 

    /**
     * @param emptyView 空界面显示的控件
     * @param view      显示状态与RecycleView一致的View
     */
    private void checkIfEmpty(View emptyView, View... view) {
        //获取adapter下面item的个数
        final boolean emptyViewVisible = getAdapter().getItemCount() == 0;
        if (getAdapter() == null) return;
        //如果item=0空布局显示,否则隐藏
        if (emptyView != null)
            emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
        //如果item=0布局数组隐藏,否则显示
        if (view != null)
            for (View v : view) {
                if (v != null)
                    v.setVisibility(emptyViewVisible ? GONE : VISIBLE);
            }
        //如果item=0隐藏EmptyRecyclerView,否则显示
        setVisibility(emptyViewVisible ? GONE : VISIBLE);
    }

使用方法非常简单,在RecyclerView设置adapter之后添加:

 

 

 View view=View.inflate(MainActivity.this,R.layout.include_empty,null);
        /**
         *  设置空布局
         *  第一个参数:当数据清空时显示的布局
         *  第二个参数:后可添加多个布局,当数据清空时一起隐藏的布局
         */
        mRecyclerView.setEmptyView(view,tvHeader);

 

 


点击打开链接下载源码

 

 

  

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值