Android 项目开发必用的库 (1)BaseQuickAdapter 简介

         今天双十一呀 ,昨晚有多少人进行了需要剁手的活动 。看天猫的数据今年又是再次打破之前的记录 ,今年 100 亿 用了 96 秒 ,比去年的 125 秒多了 29 秒 ,按照这个速度明年估计的 66 秒左右 ,那后年铁定的到一分钟之内 。今年是 5G 的商用年 ,后年 5G怎么也的大部分地区可用 ,所以使用 5G 在一分钟之内交易额达到 100亿 的话 ,从技术上来看问题不大 (纯属在扯哈哈哈哈)。

( 以上写于 双十一 只有遍开始了 996 )

简介

Github :BaseRecyclerViewAdapterHelper

官网使用指南:使用指南

使用复杂度:0.5

推荐指数:* * * * *

锲子

RecyclerView  (RecyclerView 不止眼前的 setAdapter 和 notify ,还有诗和远方 )

作为可以取代 ListView 的一个扩展性控件 ,除了包含其原有的功能更是扩展了一些强大的效果 (展示大量数据)。

但是强大的背后必然会使用复杂 ,除了都需要考虑的复用 Item 之外 ,RecyclerView 还要考虑事件回调和添加 HeaderView 和 FooterView 的数据刷新问题 ,再往细了说还得多加一个指定方向的 LayoutManager 。

再深一点的话 ,两个控件的缓存也有区别 ,毕竟 RecyclerView 名义上是友好大量数据展示 。

还有刷新功能 ,RecyclerView 的局部刷新功能属于一个大的亮点 ,不过跟他的缓存嗨是有关系的 (略过吧 ,缓存有点东西)

PS:遇到过的问题

1. RecyclerView 高度不能自适应 。

2.RecyclerView 最后一个 Item 显示不全被遮挡 。

PS :附带几篇 RecyclerView 的介绍 。

https://mp.weixin.qq.com/s/Zwz_xKqIaGFHeskI_ujvRA

https://mp.weixin.qq.com/s/ZA_GGD83eCcYtPUKh-ZP4g

在微信的搜一搜上查找的 。

使用介绍

强烈建议 clone 一下跑一遍 Demo 试试 。体验一下这个库的简单与强大 。

Gradle 导入此依赖

    api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.42'

和原始的adapter相对,减少70%的代码量。

一点都不夸张 。

正常Adapter

public class LearnHistoryLiveAdapter extends BaseQuickAdapter<HistoryLearnBean, BaseViewHolder> {

    public LearnHistoryLiveAdapter(@Nullable List<HistoryLearnBean> data) {
        super(R.layout.item_learn_history_live, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, HistoryLearnBean item) {

        helper.setText(R.id.tv_classroom_name, item.getTargetTitle());
        helper.setText(R.id.tv_live_name, item.getTitle());
        CircleProgressView progress_view = helper.getView(R.id.progress_view);// 观看率
        TextView tv_percent = helper.getView(R.id.tv_percent);// 观看率 数字
        TextView tv_live_work = helper.getView(R.id.tv_live_work);// 直播出勤时长
        
        ...
        ...
        ...
 
    }
}

PS:该库不影响原有 RecyclerView 代码 code 。

添加事件

    @Override
    protected void convert(BaseViewHolder helper, HistoryLearnBean item) {

        helper.setText(R.id.tv_classroom_name, item.getTargetTitle());
        helper.setText(R.id.tv_live_name, item.getTitle());
        CircleProgressView progress_view = helper.getView(R.id.progress_view);// 观看率
        TextView tv_percent = helper.getView(R.id.tv_percent);// 观看率 数字
        TextView tv_live_work = helper.getView(R.id.tv_live_work);// 直播出勤时长
        
        ...
        ...
        ...

          helper.addOnClickListener(R.id.tv_introduction)
                .addOnClickListener(R.id.tv_homework)
                .addOnClickListener(R.id.tv_courseware)
                .addOnClickListener(R.id.tv_study_type);
    }
      adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                HistoryLearnBean item = (HistoryLearnBean) adapter.getData().get(position);
                switch (view.getId()) {
                    case R.id.tv_courseware:
                        ARouter.getInstance().build("/edusoho/lesson/filelist")
                                .withInt(Const.ID, item.getId())
                                .withString(Const.TITLE, item.getTitle())
                                .navigation(mActivity);
                        break;
                  
                    case R.id.tv_introduction:

                        if (introductionDialog == null)
                            introductionDialog = new IntroductionDialog();

                        introductionDialog.setLoadUrl(getResources().getString(R.string.app_base_url) + Const.LESSON_INTRODUCATION.replace("id", String.valueOf(item.getId())));
                        introductionDialog.setCancelOnTouchOutside(false);
                        introductionDialog.showDialog(getFragmentManager());

                        break;
                    default:
                        break;
                }
            }
        });

添加头部和尾部

adapter.addHeaderView(initHeaderView());
adapter.addFooterView(initFooterView());

PS : 不需要去考虑数据刷新的问题 。

上拉加载

回调

mQuickAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
            @Override public void onLoadMoreRequested() {
                mRecyclerView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (mCurrentCounter >= TOTAL_COUNTER) {
                            //数据全部加载完毕
                            mQuickAdapter.loadMoreEnd();
                        } else {
                            if (isErr) {
                                //成功获取更多数据
                                mQuickAdapter.addData(DataServer.getSampleData(PAGE_SIZE));
                                mCurrentCounter = mQuickAdapter.getData().size();
                                mQuickAdapter.loadMoreComplete();
                            } else {
                                //获取更多数据失败
                                isErr = true;
                                Toast.makeText(PullToRefreshUseActivity.this, R.string.network_err, Toast.LENGTH_LONG).show();
                                mQuickAdapter.loadMoreFail();

                            }
                        }
                    }

                }, delayMillis);
            }
        }, mReyclerView);

加载状态

// 加载完成
mQuickAdapter.loadMoreComplete();

// 加载失败
mQuickAdapter.loadMoreFail();

// 加载结束
mQuickAdapter.loadMoreEnd();

多布局

数据 Bean 或者 Module 需要 试下 MultiItemEntity 并且重写 getItemType()函数 

public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<MultipleItem, BaseViewHolder> {

    public MultipleItemQuickAdapter(List data) {
        super(data);
        addItemType(MultipleItem.TEXT, R.layout.text_view);
        addItemType(MultipleItem.IMG, R.layout.image_view);
    }

    @Override
    protected void convert(BaseViewHolder helper, MultipleItem item) {
        switch (helper.getItemViewType()) {
            case MultipleItem.TEXT:
                helper.setImageUrl(R.id.tv, item.getContent());
                break;
            case MultipleItem.IMG:
                helper.setImageUrl(R.id.iv, item.getContent());
                break;
        }
    }

}

参考 :

https://www.jianshu.com/p/b343fcff51b0

发布了57 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37492806/article/details/103007770