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<AppInfo> {
//参1上下文
public HomeAdapter(Context context, int layoutId, List<AppInfo> 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—布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:minWidth="1000dp"
android:orientation="horizontal"
android:padding="15dp">
<ProgressBar
android:id="@+id/pb_loadmore"
android:layout_width="28dp"
android:layout_height="28dp" />
<TextView
android:id="@+id/tv_loadmore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="加载中..."
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
</LinearLayout>
设置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<T> extends LoadMoreWrapper<T> {
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布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="180dp" />
</LinearLayout>
简单使用
//添加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<Object> {
//传入布局文件
@Override
public int getItemViewLayoutId() {
return R.layout.adapter_title;
}
/**
* * 什么情况是属于当前类型--当什么情况的时候,使用此view
*
*/
//参1传进来的数据
@Override
public boolean isForViewType(Object item, int position) {
return item instanceof String;
}
//设置数据—参数2传进来的 数据
@Override
public void convert(ViewHolder holder, Object o, int position) {
String s = (String) o;
holder.setText(R.id.tv_title, s);
}
}
条目2同上
//写一个类实现ItemViewDelegate<数据类型>
public class SubItemDelagate implements ItemViewDelegate<Object> {
//传入对应的条目布局
@Override
public int getItemViewLayoutId() {
return R.layout.adapter_sub;
}
//什么时候使用该类型
@Override
public boolean isForViewType(Object item, int position) {
return item instanceof SubCategory;
}
//设置数据
@Override
public void convert(ViewHolder holder, Object o, int position) {
SubCategory sub = (SubCategory) o;
holder.setText(R.id.tv_sub1, sub.name1);
GlideUtil.loadImage(sub.url1, (ImageView) holder.getView(R.id.iv_image1));
//但是第二个和第三个需要判断是否为空
if (!TextUtils.isEmpty(sub.name2)) {
holder.setText(R.id.tv_sub2, sub.name2);
GlideUtil.loadImage(sub.url2, (ImageView) holder.getView(R.id.iv_image2));
} else {
holder.setVisible(R.id.ll_sub2, false);
}
if (!TextUtils.isEmpty(sub.name3)) {
holder.setText(R.id.tv_sub3, sub.name3);
GlideUtil.loadImage(sub.url3, (ImageView) holder.getView(R.id.iv_image3));
} else {
holder.setVisible(R.id.ll_sub3, false);
}
}
}