RecyclerView多item實現(xiàn)以及添加一個banner

RecyclerView
首先需要導包

implementation 'com.android.support:recyclerview-v7:29.4.0'

注意,recyclerview的版本號,要和targetSdkVersion一致。
xml定義:

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
 />

activity里面初始化:

RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
HomePageAdapter adapter = new HomePageAdapter();
recyclerView.setAdapter(adapter);

LinearLayoutManager默認是垂直布局。
重點是HomePageAdapter的實現(xiàn)。
HomePageAdapter:
首先需要繼承

RecyclerView.Adapter<RecyclerView.ViewHolder>

導入三個重寫方法:

onCreateViewHolder onBindViewHolder getItemCount

由于很多時候,recyclerview里面的item類型并不一樣,需要定制每個item,還需要重寫方法:getItemViewType。
要接受數(shù)據(jù),得定義一個addData()。
這幾個方法具體的實現(xiàn):(第一個item為一個banner)
首先得初始化數(shù)據(jù),定義一個方法接受數(shù)據(jù):

List<ExampleBaseBean> datas = new ArrayList<>();
public void addData(HomeModel model){
        CommonModelListBean bannerList = new CommonModelListBean();
        bannerList.setCommonModelListBean(model.getbannerList());
        bannerList.setViewType(BANNER_TYPE);
        datas.add(bannerList);
        notifyDataSetChanged();//注意這個,拿到數(shù)據(jù)需要更新一下。
}

這個數(shù)據(jù),在上一節(jié)里面,由MainPresenter傳遞給HomePageActivity的getHomeModel。

public void getHomeModel(HomeModel homeModel) {
        if(adapter != null){
            adapter.addData(homeModel);
        }
}

關于數(shù)據(jù)的容器datas,這里設置一個ExampleBaseBean專門盛放。

public class ExampleBaseBean {
    private int viewType;

    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
    }
}

然后,讓item的數(shù)據(jù)bean繼承這個父類。

public class CommonModelListBean extends ExampleBaseBean{

    private List<CommonModel> commonModelsBean;

    public List<CommonModel> getCommonModelListBean() {
        return commonModelsBean;
    }

    public void setCommonModelListBean(List<CommonModel> commonModelsBean) {
        this.commonModelsBean = commonModelsBean;
    }
}

這樣做有2個好處,第一個是將HomeModel里面的數(shù)據(jù),拆分為不同的bean,添加到datas里面。
第二個是設置一個setViewType方法,用來區(qū)分不同的ItemViewType。

public int getItemViewType(int position) {
        if(datas.size()>0){
            return datas.get(position).getViewType();
        }
        return super.getItemViewType(position);
}

區(qū)分好了ViewType,接下來看是創(chuàng)建ViewHolder:

public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == BANNER_TYPE){
            return new BannerHolder(LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.top_layout,parent,false
            ));
        }
        return null;
    }
public class BannerHolder extends RecyclerView.ViewHolder{
        Banner banner;
        public BannerHolder(@NonNull View itemView) {
            super(itemView);
            banner = itemView.findViewById(R.id.top_item);
        }
}

onCreateViewHolder創(chuàng)建一個RecyclerView.ViewHolder,初始化后,在onBindViewHolder里面綁定數(shù)據(jù)。

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof BannerHolder){
            //放圖片地址的集合
            List<String> list_path = new ArrayList<>();
            //放標題的集合
            List<String> list_title = new ArrayList<>();
            final CommonModelListBean bannerBean = (CommonModelListBean)datas.get(position);
            Log.v("kk",bannerBean.getCommonModelListBean().get(0).getIcon()+"==");
            for (int a = 0; a < bannerBean.getCommonModelListBean().size(); a++) {
                list_path.add(bannerBean.getCommonModelListBean().get(a).getIcon());
                list_title.add("好好學習" + a);
            }
            //設置內(nèi)置樣式,共有六種可以點入方法內(nèi)逐一體驗使用。
            ((BannerHolder) holder).banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE);
            //設置圖片加載器,圖片加載器在下方
            ((BannerHolder) holder).banner.setImageLoader(new MyLoader());
            //設置圖片網(wǎng)址或地址的集合
            ((BannerHolder) holder).banner.setImages(list_path);
            //設置輪播的動畫效果,內(nèi)含多種特效,可點入方法內(nèi)查找后內(nèi)逐一體驗
            ((BannerHolder) holder).banner.setBannerAnimation(Transformer.Default);
            //設置輪播圖的標題集合
            ((BannerHolder) holder).banner.setBannerTitles(list_title);
            //設置輪播間隔時間
            ((BannerHolder) holder).banner.setDelayTime(3000);
            //設置是否為自動輪播,默認是“是”。
            ((BannerHolder) holder).banner.isAutoPlay(true);
            //設置指示器的位置,小點點,左中右。
            ((BannerHolder) holder).banner.setIndicatorGravity(BannerConfig.CENTER)
                    //以上內(nèi)容都可寫成鏈式布局,這是輪播圖的監(jiān)聽。比較重要。方法在下面。
                    .setOnBannerListener(this)
                    //必須最后調(diào)用的方法,啟動輪播圖。
                    .start();
        }
    }

最后設置ItemCount

public int getItemCount() {
      return datas.size();
}

此時,一個recycleView的item就完成了,其他的item,按照這個依次添加就行了。
(注意banner的xml文件名不要出現(xiàn)banner以及,id不要出現(xiàn)banner,會導致莫名其妙的錯誤。)

具體代碼:
https://github.com/doudousang/recyclerview_banner.git

參考網(wǎng)址:
recycleView多item的實現(xiàn)
https://blog.csdn.net/u012604975/article/details/80780164
https://blog.csdn.net/qq_36523667/article/details/78844312
關于Android mvp模式中,adapter應該放在什么位置
https://segmentfault.com/q/1010000008534760/a-1020000019028935
banner的實現(xiàn)
https://blog.csdn.net/qq_36621990/article/details/76020236
工具:
在線JSON轉Java Bean代碼
http://www.jsons.cn/json2java/
帶駝峰標識的轉行器

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容