gethub地址
省去编写大量的viewholder代码
使用
依赖
ForRecyclerView
compile 'com.zhy:base-rvadapter:3.0.3'
ForListView
compile 'com.zhy:base-adapter:3.0.3'
adapter
继承commonadapter<数据的泛型>
commonadapter是baseadapter类库里面 的一个类
public class HomeAdapter extends CommonAdapter {
//参1上下文
public HomeAdapter(Context context, int layoutId, List datas) {
super(context, layoutId, datas);
}
//设置数据
@Override
protected void convert(ViewHolder holder, AppInfo appInfo, int position) {
//设置数据
holder.setText(R.id.tv_title, appInfo.name)
.setText(R.id.tv_size, Formatter.formatFileSize(holder.itemView.getContext(), appInfo.size))
.setText(R.id.tv_des, appInfo.des)
.setRating(R.id.rb_star, appInfo.stars);
//加载图片
Glide.with(holder.itemView.getContext())
.load(Url.ImagePrefix + appInfo.iconUrl)
.bitmapTransform(new CropCircleTransformation(holder.itemView.getContext()))
.placeholder(R.drawable.ic_default)//默认的图片
.error(R.mipmap.ic_launcher)//加载失败显示的图片
.crossFade(1000)//渐渐显示出来的时间
//找到view--getview(id)
.into((ImageView) holder.getView(R.id.iv_icon));
}
}
设置adapter
//参1上下文--参2布局--参3数据集合
adapter = new HomeAdapter(getContext(), R.layout.adapter_home, list);
recyclerView.setAdapter(adapter);
条目点击监听器—recyclerview
//设置条目点击监听了--获取到点击条目的位置
adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {
//当条目点击的时候执行
@Override
public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
//因为有头布局所以应用的条目索引从1开始
//然而集合的索引是从0开始
AppInfo appInfo = list.get(position - 1);
}
//当长按条目的时候执行---按下不放超过400ms就算长按
@Override
public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
return false;
}
});
上拉加载loadmore
Baseadapter 类库中的loadmore
加载更多的view—布局
设置adapter
//初始化加载更多的LoadMoreWrapper--getcount里面的条目在原来的天目上+1
loadMoreWrapper = new LoadMoreWrapper<>(adapter);
//设置加载更多的View
loadMoreWrapper.setLoadMoreView(R.layout.layout_loadmore);
recyclerView.setAdapter(loadMoreWrapper);
通知加载更多
//通知更新数据
loadMoreWrapper.notifyDataSetChanged();
设置上拉加载监听
//设置加载更多的监听器
loadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
//判断是否加载
if (list.size() >= 60) {
//数据到头,--
loadMoreWrapper.showLoadMore(true);
return;
}
//判断不是第一页再进行加载
if (list.size() >= 20) {
---如果不加上来就会调用一次—这样就调用了两次
loadData();
}
}
});
友好的提示用户加载完了—即更改上拉加载view里面的数据—会将圈拉下来----优化loadmore
定义一个类继承它
public class LoadMoreAdapter extends LoadMoreWrapper {
private View loadmoreView;
public LoadMoreAdapter(RecyclerView.Adapter adapter, Context context) {
super(adapter);
loadmoreView = View.inflate(context, R.layout.layout_loadmore, null);
//设置加载更多的View
setLoadMoreView(loadmoreView);
}
/**
* * 没有更多数据了
* *
* * @param isNoMoreData
*
*/
public void showLoadMore(boolean isNoMoreData) {
TextView tvLoad = (TextView) loadmoreView.findViewById(R.id.tv_loadmore);
ProgressBar pbLoadmore = (ProgressBar) loadmoreView.findViewById(R.id.pb_loadmore);
tvLoad.setText(isNoMoreData ? "暂无更多数据" : "加载中...");
pbLoadmore.setVisibility(isNoMoreData ? View.GONE : View.VISIBLE);
}
}
添加头布局—并展示
由于RecyclerView并没有提供addHeaderView的方法,
头也可以当做条目来做
baseadapter类库已经帮助我们封装好了HeaderAndFooter,HeaderAndFooterWrapper的用法很简单需要包裹一个普通的adapter,类似装饰者设计模式
header布局
简单使用
//添加header—装饰者模式
headerFooterWrapper = new HeaderAndFooterWrapper<>(adapter);
View headerView = View.inflate(getContext(),R.layout.layout_home_header,null);
viewPager = (ViewPager) headerView.findViewById(R.id.viewPager);
headerFooterWrapper.addHeaderView(headerView);
多种条目
baseadapter库的multiItemTypeAdapter实现多种条目
设置adapter
MultiItemTypeAdapter adapter = new MultiItemTypeAdapter(getContext(), list);
//添加title类型---有几种类型添加集中类型
adapter.addItemViewDelegate(new TitleItemDelagate());
adapter.addItemViewDelegate(new SubItemDelagate());
recyclerView.setAdapter(adapter);
添加条目类型
有几种布局就写几个条目类型
布局略…
定义一个类继承ItemViewDelegate
//写一个类实现ItemViewDelegate<数据类型>
public class TitleItemDelagate implements ItemViewDelegate
条目2同上
//写一个类实现ItemViewDelegate<数据类型>
public class SubItemDelagate implements ItemViewDelegate