Android之RecyclerView多布局

做一个项目的主页面的时候,想要它呈现出来的效果,不单一,更丰富那就要使用多布局来展现出来,那么就要思考一个问题。他呈现的是多个布局,怎么才能展现出来不同的布局?逻辑很简单,通过设置几个flag,来表示这些布局当前显示的是哪个布局,接下来,和代码结合了解一下:

第一部分:有几个布局就写几个flag

public class MyRecycler extends RecyclerView.Adapter{

    private Context context;
    private HomeBean.ResultBean result;
    private LayoutInflater layoutInflater;

    public static final int banner = 0;//广告
    public static final int chanel= 1;//频道
    public static final int act=2;//活动
    public static final int seckill=3;//秒杀
    public static final int recommend=4;//推荐
    public static final int hot=5;//热卖

    private int currenType= banner;//当前显示

    public MyRecycler(Context context, HomeBean.ResultBean result) {
        this.context = context;
        this.result = result;
        layoutInflater=LayoutInflater.from(context);
    }

第二部分:继承RecyclerViewAdapter重写的方法:

1.onCreateViewHolder():判断当前是第几个布局,返回当前的布局(你的布局的高度一定要是自定高度)

  @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType==banner){
            return new bannerHolder(context,layoutInflater.inflate(R.layout.banner_item,null));
        }else if (viewType==chanel){
            return new MyViewHolder(context,layoutInflater.inflate(R.layout.channel_item,null));
        }else if (viewType==act){
            return new ActHolder(context,layoutInflater.inflate(R.layout.act_item,null));
        }else if (viewType==seckill){
            return new SeckillHolder(context,layoutInflater.inflate(R.layout.seckill_item,null));
        }else if (viewType==recommend){
            return new RecommendHolder(context,layoutInflater.inflate(R.layout.recommend_item,null));
        }else if (viewType==hot){
            return new HotHolder(context,layoutInflater.inflate(R.layout.hot_item,null));
        }
        return null;
    }

2. onBindViewHolder(),根据对应的布局,传对应的数据:

  @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (getItemViewType(position)==banner){
            bannerHolder bannerHolders= (bannerHolder) holder;
            List<HomeBean.ResultBean.BannerInfoBean> banner_info = result.getBanner_info();
            bannerHolders.setData(banner_info);
        }else if (getItemViewType(position)==chanel){
            MyViewHolder myViewHolder= (MyViewHolder) holder;
            List<HomeBean.ResultBean.ChannelInfoBean> channel_info= result.getChannel_info();
            myViewHolder.setData(channel_info);
        }else if (getItemViewType(position)==act){
            ActHolder actHolder= (ActHolder) holder;
            List<HomeBean.ResultBean.ActInfoBean> act_info = result.getAct_info();
            actHolder.setData(act_info);
        }else if (getItemViewType(position)==seckill){
            SeckillHolder seckillHolder= (SeckillHolder) holder;
            HomeBean.ResultBean.SeckillInfoBean seckill_info = result.getSeckill_info();
            seckillHolder.setData(seckill_info);
        }else if (getItemViewType(position)==recommend){
            RecommendHolder recommendHolder= (RecommendHolder) holder;
            List<HomeBean.ResultBean.RecommendInfoBean> recommend_info = result.getRecommend_info();
            recommendHolder.setData(recommend_info);
        }else if (getItemViewType(position)==hot){
            HotHolder hotHolder= (HotHolder) holder;
            List<HomeBean.ResultBean.HotInfoBean> hot_info = result.getHot_info();
            hotHolder.setData(hot_info);
        }
    }

3. getItemViewType()item类型

/**
     * item类型:
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        switch (position) {
            case banner:
                currenType = banner;
                break;
            case chanel:
                currenType = chanel;
                break;
            case act:
                currenType = act;
                break;
            case seckill:
                currenType = seckill;
                break;
            case recommend:
                currenType = recommend;
                break;
            case hot:
                currenType = hot;
                break;
        }
        return currenType;
    }

4.getitemcount()这里的个数,一定要满足你要实现的布局个数,不匹配就会报空指针的错误!

 /**
     * item的总个数:
     * @return
     */
    @Override
    public int getItemCount() {
        return 6;
    }

第二部分:进行适配:在这里使用网格布局,显示成垂直一列:

  GridLayoutManager gridLayoutManager=new GridLayoutManager(getActivity(),1);
  rv.setLayoutManager(gridLayoutManager);

  MyRecycler recycler=new MyRecycler(getActivity(),result);
  rv.setAdapter(recycler);

第三部分:进行细节功能的操作:

1.设置一个小控件,当超过三个布局自动隐藏:

 //设置跨度监听事件:

gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
   @Override
   public int getSpanSize(int position) {
       if (position<=3){
           //隐藏:
           top.setVisibility(View.GONE);
       }else {
           //显示:
           top.setVisibility(View.VISIBLE);
        }
       //只能返回1
       return 1;
       }
    });

2.以及置顶功能:

  //置顶监听;
                image.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        rv.scrollToPosition(0);
                    }
                });

最终效果如下:

猜你喜欢

转载自blog.csdn.net/LoverLeslie/article/details/84101339
今日推荐