-
Notifications
You must be signed in to change notification settings - Fork 225
XRecyclerViewAdapter详解
Spring edited this page Aug 3, 2017
·
4 revisions
一个用于简化RecyclerView Adapter的开发库,包含添加Header,Footer,加载更多,加载失败,加载到底和支持多种布局,分割线工具类。
我们这里封装的adapter为了保证使用者的可定制性,并没有去改动去继承RecyclerView,而是通过改动adapter的方式来实现, 使用者不需要为了本框架没有某个功能而纠结,你完全可以和其他自定义RecyclerView配合使用。
- 添加分割线
recyclerView.addItemDecoration(new DividerDecoration(Color.parseColor("#C4C4C4"),1));
- 添加/移除header,footer
final View headerView = LayoutInflater.from(this).inflate(R.layout.header, recyclerView, false);
final View footerView = LayoutInflater.from(this).inflate(R.layout.footer, recyclerView, false);
adapter.addHeaderView(headerView);
adapter.addFooterView(footerView);
adapter.removeFooterView(footerView);
- 点击事件
//点击事件
adapter.setOnItemClickListener(new XRecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
}
});
//开启加载更多功能,默认关闭
adapter.isLoadMore(true);
//加载更多事件
adapter.setOnLoadMoreListener(new XRecyclerViewAdapter.OnLoadMoreListener() {
@Override
public void onRetry() {//加载失败,重新加载回调方法
}
@Override
public void onLoadMore() {//加载更多回调方法
}
});
recyclerView.setAdapter(adapter);
class TestAdapter extends XRecyclerViewAdapter<String> {
public TestAdapter(RecyclerView recyclerView, List<String> datas) {
super(recyclerView, datas, R.layout.dome_item);
}
@Override
public void bindData(XViewHolder holder, String data, int position) {
//方法一:
holder.setText(R.id.text, data);
//方法二:
//TextView textView = holder.getView(R.id.text);
//textView.setText(data);
}
}
public class News {
/** 单图布局样式 */
public static final int TYPE_SINGLE_PICTURE = 0;
/** 无图布局样式 */
public static final int TYPE_NONE_PICTURE = 1;
private int newsType;
private String title;
private String imageUrl;
private String author;
private String time;
}
class MultiTypeAdapter extends XRecyclerViewAdapter<News> {
public MultiTypeAdapter(@NonNull RecyclerView mRecyclerView, List<News> dataLists) {
super(mRecyclerView, dataLists);
}
@Override
public int getItemLayoutResId(News data, int position) {
int layoutResId = -1;
switch (data.getNewsType()){
case News.TYPE_NONE_PICTURE:
layoutResId = R.layout.dome_item;
break;
case News.TYPE_SINGLE_PICTURE:
layoutResId = R.layout.dome_image_item;
break;
}
return layoutResId;
}
@Override
public void bindData(XViewHolder holder, News data, int position) {
switch (data.getNewsType()){
case News.TYPE_NONE_PICTURE:
holder.setText(R.id.text, data.getTitle());
break;
case News.TYPE_SINGLE_PICTURE:
holder.setText(R.id.newTitle, data.getTitle())
.setText(R.id.newAuthor,data.getAuthor())
.setText(R.id.newTime,data.getTime());
ImageView view=holder.getView(R.id.newImage);
Glide.with(XFrame.getContext())
.load(data.getImageUrl())
.crossFade()
.transform(new GlideCircleTransform(XFrame.getContext()))
.into(view);
break;
}
}
}
showLoadError();//显示加载错误
showLoadComplete();//没有更多数据了
isLoadMore(true);//开启加载更多功能,默认关闭
addHeaderView(headerView);//添加header,可以添加多个
addFooterView(footerView);//添加footer,可以添加多个
removeFooterView(footerView);//移除footer
removeHeaderView(footerView);//移除header
getItemCount();//获取总item数量包括头尾
getDataCount();//获取数据item数量
getHeaderCount()//获取header数量
getFooterCount()//获取footer数量
setOnLoadMoreListener()设置加载更多监听
setOnItemClickListener()设置点击事件
setOnItemLongClickListener()设置长按事件
setDataLists(List<T> datas)//设置数据集合(清空以前的集合数据,在重新添加,不同于addAll是直接添加)
getItem(int position)//获取指定位置的数据
getDataLists()//获取数据集合
add(T data)//添加数据条目
add(int position, T data)//在指定位置添加数据条目
addAll(List<T> datas) //添加数据条目集合
addAll(int position,List<T> datas) //在指定位置添加数据条目集合
remove(int position)//删除指定索引数据条目
remove(T data)//删除指定数据条目
replace(int location, T newData) //替换指定索引的数据条目
replace(T oldData, T newData) //替换指定数据条目
move(int fromPosition, int toPosition)//交换两个数据条目的位置
clear() 清空
从小的功能做起,只做必要的封装,让开发更加简单 ———— XFrame