BRVAH BaseMultiItemQuickAdapter多布局实现

首页电商化布局;
各种原因吧,出于考虑遇到过一个首页需要请求多个接口来获取数据; 或者隐藏某块布局的需求等等,最后和后台讨论定用列表统一返回,type区分模块的形式,
当然除了头部搜索;底部推荐列表位置固定,(滑动效果的限制)
中间部分实现随便变换位置或隐藏显示,后台随时控制的效果,所以想到用BRVAH的多布局实现

当然还遇到了很多问题:

  • 比如嵌套Tablayout切换ViewPager高度自适应
  • 双击Tab回顶部
  • RecycleView横向滑动2个展示平分,3个及以上展示2个半等,有空会再贴出来,当给自己做个记录吧

先上最终效果图:图上标了type对应区域,不要问搜索为何是7,因为后加的哈,不重要

在这里插入图片描述

好了,开始一顿操作啦啦啦

1、先来首页布局吧,

本来看结构就好,想了一下自己平时浏览的痛苦,还是贴全部吧,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/MatchMatch.Vertical"
    android:background="@color/parent_bg">

    <include layout="@layout/item_multiple_home_search" />

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/smartRefreshLayout"
        style="@style/MatchMatch">
        <android.support.design.widget.CoordinatorLayout
            style="@style/MatchMatch">

            <android.support.design.widget.AppBarLayout
                android:id="@+id/app_bar"
                style="@style/MatchWrap">

                <android.support.design.widget.CollapsingToolbarLayout
                    style="@style/MatchWrap"
                    android:background="@color/parent_bg"
                    app:contentScrim="@color/parent_bg"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_home_head"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/color_FFFFFF"
                        app:layout_collapseMode="parallax"
                        app:layout_collapseParallaxMultiplier="0" />

                    <android.support.v7.widget.Toolbar
                        android:id="@+id/tool_bar"
                        style="@style/MatchWrap"
                        android:layout_height="@dimen/base0dp"
                        android:visibility="gone" />
                </android.support.design.widget.CollapsingToolbarLayout>

                <android.support.design.widget.TabLayout
                    android:id="@+id/tablayout"
                    style="@style/MatchWrap"
                    android:layout_gravity="bottom"
                    app:tabBackground="@android:color/transparent"
                    app:tabIndicatorColor="@color/text_color_pink"
                    app:tabIndicatorHeight="0dp"
                    app:tabSelectedTextColor="@color/text_color_pink"
                    app:tabTextAppearance="@style/TabLayoutTextStyle"
                    app:tabTextColor="@color/color_666666" />

            </android.support.design.widget.AppBarLayout>

            <android.support.v4.widget.NestedScrollView
                android:id="@+id/scrollView"
                style="@style/MatchMatch"
                android:fillViewport="true"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">
                <android.support.v4.view.ViewPager
                    android:id="@+id/viewpager"
                    style="@style/MatchMatch" />
            </android.support.v4.widget.NestedScrollView>

            <include layout="@layout/layout_list_no_net"/>

        </android.support.design.widget.CoordinatorLayout>
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
</LinearLayout>

2、初始化:

presenter.getHomeIndexData();//请求接口
initHomeHeader();//初始化

   /**
     * 初始化首页架构
     */
    private void initHomeHeader() {
        recyclerList.setLayoutManager(new LinearLayoutManager(mActivity));
        multipleHomeAdapter = new MultipleHomeAdapter(mActivity,getMultipleItemData(homeDataList));
        multipleHomeAdapter.setOnLoadMoreListener(null, recyclerList);
        multipleHomeAdapter.disableLoadMoreIfNotFullPage(recyclerList);
//        multipleHomeAdapter.setEmptyView(R.layout.layout_recycler_empty_view);
        recyclerList.setAdapter(multipleHomeAdapter);
    }


   //加载成功
  @Override
    public void getHomeIndexDataSuccess(List<HomeIndexBean> data) {
        if (smartRefreshLayout != null) {
            smartRefreshLayout.finishRefresh();
        }
        presenter.dismissLoading();
        rlNoNet.setVisibility(View.GONE);
        appBar.setVisibility(View.VISIBLE);
        this.homeDataList = data;
        multipleHomeAdapter.setNewData(getMultipleItemData(homeDataList));
        initRecommend(); //底部推荐个人项目在此不做赘述
    }

//加载失败
    @Override
    public void getHomeIndexDataFaile() {
        if (smartRefreshLayout != null) {
            smartRefreshLayout.finishRefresh();
        }
        appBar.setVisibility(View.GONE);
        rlNoNet.setVisibility(View.VISIBLE);
        presenter.dismissLoading();
        multipleHomeAdapter.loadMoreComplete();
        multipleHomeAdapter.loadMoreFail();
    }


 //重点转化方法啊,
 /**
     * 添加布局Itemtype
     * @param itemList
     * @return
     */
    private List<HomeIndexBean> getMultipleItemData(List<HomeIndexBean> itemList) {
        if (null==itemList||itemList.size()<=0){
            return null;
        }
        for (int i=0;i<itemList.size();i++) {
          //type标识
            itemList.get(i).setItemType(itemList.get(i).getType());
            if (itemList.get(i).getType()==7){  //搜索
                tv_main_search.setText(itemList.get(i).getData().getPlaceholder());
            }
        }
        return itemList;
    }

3、Adapter 处理

public class MultipleHomeAdapter extends BaseMultiItemQuickAdapter<HomeIndexBean, BaseViewHolder> {

    private BaseActivity context;

    public MultipleHomeAdapter(BaseActivity context, List data) {
        super(data);
        this.context = context;
        addItemType(HomeIndexBean.TYPE1, R.layout.item_multiple_home_banner);
        addItemType(HomeIndexBean.TYPE2, R.layout.item_multiple_home_operate);
        addItemType(HomeIndexBean.TYPE3, R.layout.item_multiple_home_notice);
        addItemType(HomeIndexBean.TYPE4, R.layout.item_multiple_home_gametype);
        addItemType(HomeIndexBean.TYPE5, R.layout.item_multiple_home_advert);
        //注意,虽然6,7对于我来说在此用不到,但是要写哦,所以我里面设置了空布局
        //至于为什么我没用同一个,因为都用item_multiple_home_empty影响了
        //SmartRefreshLayout的刷新,也不知道为啥,单独引了个布局就好了
        addItemType(HomeIndexBean.TYPE6, R.layout.item_multiple_home_recommend);
        addItemType(HomeIndexBean.TYPE7, R.layout.item_multiple_home_empty);
    }

    @Override
    protected void convert(BaseViewHolder helper, HomeIndexBean item) {
        switch (helper.getItemViewType()) {
            case HomeIndexBean.TYPE1: //Banner
                initBannerData(helper,item);
                break;
            case HomeIndexBean.TYPE2: //功能操作
                initOperateData(helper,item);
                break;
            case HomeIndexBean.TYPE3: //公告
                initFlipperData(helper,item);
                break;
            case HomeIndexBean.TYPE4: //游戏分类
                initGameType(helper,item);
                break;
            case HomeIndexBean.TYPE5: //广告
                initAdvertData(helper,item);
                break;
            case HomeIndexBean.TYPE6: //推荐
                break;
            case HomeIndexBean.TYPE7: //搜索
                break;
        }
    }
    }

4、MultiItemEntity

/**
 * Data: 2019/9/27
 * Description:
 *
 * @author: zhanggf
 */
public class HomeIndexBean implements Serializable,MultiItemEntity {
    private int type;
    private HomeIndexListBean data; //自己的数据结构就不贴了

    public static final int TYPE1 = 1;
    public static final int TYPE2 = 2;
    public static final int TYPE3 = 3;
    public static final int TYPE4 = 4;
    public static final int TYPE5 = 5;
    public static final int TYPE6 = 6;
    public static final int TYPE7 = 7; //搜索
    private int itemType;


    @Override
    public int getItemType() {
        return itemType;
    }

    public void setItemType(int itemType) {
        this.itemType = itemType;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public HomeIndexListBean getData() {
        return data;
    }

    public void setData(HomeIndexListBean data) {
        this.data = data;
    }
}

//补充结构

public class HomeIndexEntity  {
    private List<HomeIndexBean> conf;
    public List<HomeIndexBean> getConf() {
        return conf;
    }

    public void setConf(List<HomeIndexBean> conf) {
        this.conf = conf;
    }
}
package com.huanqiu.miudeal.bean;

import java.io.Serializable;
import java.util.List;

/**
 * Data: 2019/3/12
 * Description:
 *
 * @author: zhanggf
 */
public class HomeIndexListBean implements Serializable {
    private List<BannerBean> list;
    private List<HomeIndexTabListBean> tab_list;
    private String placeholder; //搜索关键字
    private int time;  //Banner 切换秒数

    public List<BannerBean> getList() {
        return list;
    }

    public void setList(List<BannerBean> list) {
        this.list = list;
    }

    public List<HomeIndexTabListBean> getTab_list() {
        return tab_list;
    }

    public void setTab_list(List<HomeIndexTabListBean> tab_list) {
        this.tab_list = tab_list;
    }

    public String getPlaceholder() {
        return placeholder;
    }

    public void setPlaceholder(String placeholder) {
        this.placeholder = placeholder;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }
}

联系QQ:2240949204
参考: BRVAH官方使用指南

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
BRVAH 是一个强大的RecyclerView适配器库,它可以实现许多复杂的功能,包括列表无限循环滚动和item可点击。下面是实现这两个功能的步骤: 1. 列表无限循环滚动 BRVAH库提供了一个BannerLayoutHelper类,可以用来实现列表的无限循环滚动,具体步骤如下: (1)在适配器中重写getItemCount()方法,将其返回一个很大的数,比如Integer.MAX_VALUE,这样就可以实现列表的无限循环滚动。 (2)在适配器中重写getItemViewType()方法,根据不同的位置返回不同的viewType,比如第一个位置返回BANNER_VIEW_TYPE,其他位置返回NORMAL_VIEW_TYPE。 (3)在适配器中实现onCreateViewHolder()方法,根据不同的viewType返回不同的ViewHolder,比如BANNER_VIEW_TYPE返回BannerViewHolder,NORMAL_VIEW_TYPE返回NormalViewHolder。 (4)在BannerViewHolder中初始化BannerLayoutHelper,并将其绑定到RecyclerView上。 (5)在NormalViewHolder中将数据绑定到itemView上。 2. item可点击 BRVAH库的ViewHolder已经实现了点击事件的处理,只需要在ViewHolder中实现OnItemClickListener接口并重写onItemClick()方法即可。具体步骤如下: (1)在ViewHolder中实现OnItemClickListener接口。 (2)在ViewHolder的构造方法中将OnItemClickListener传递进来,并保存到类成员变量中。 (3)在itemView的setOnClickListener()方法中调用OnItemClickListener的onItemClick()方法。 示例代码如下: ```java public class NormalViewHolder extends BaseViewHolder<Data> implements View.OnClickListener { private OnItemClickListener mOnItemClickListener; public NormalViewHolder(View itemView, OnItemClickListener onItemClickListener) { super(itemView); mOnItemClickListener = onItemClickListener; itemView.setOnClickListener(this); } @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(getAdapterPosition()); } } @Override public void setData(Data data) { // 将数据绑定到itemView上 } } ``` 注意:以上代码只是示例,具体实现可能会有所不同,需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值