序
今天双十一呀 ,昨晚有多少人进行了需要剁手的活动 。看天猫的数据今年又是再次打破之前的记录 ,今年 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;
}
}
}
参考 :