我们在使用上拉加载,下拉刷新的时候。
有同学会出现以下情况:
在activity 中对page 进行操作。
在每一个adapter对page 进行操作。
如果是这样的话,你们可能需要一点点
抽象思维
因为page 操作是可以抽象出来的。
作者写法
优势
减少了 重复代码时间,减少对page 操作错误率。
我就直接上代码了,一看便懂。
BaseRecyclerAdapter.class
public abstract class BaseRecyclerAdapter<T extends RecyclerView.ViewHolder, E>
extends RecyclerView.Adapter<T> implements View.OnClickListener, View.OnLongClickListener {
/**
* Context
*/
protected WeakReference<Activity> mActivity;
/**
* 适配器数据
*/
protected List<E> items;
/**
* OnItemClickListener
*/
private OnItemClickListener<E> mOnItemClickListener;
/**
* OnItemLongClickListener
*/
private OnItemLongClickListener<E> mOnItemLongClickListener;
/**
* @param ctx
*/
public BaseRecyclerAdapter(Activity ctx) {
mActivity = new WeakReference(ctx);
}
@Override
public T onCreateViewHolder(ViewGroup parent, int viewType) {
T holder = getViewHolder(parent);
holder.itemView.setOnClickListener(this);
holder.itemView.setOnLongClickListener(this);
return holder;
}
/**
* 返回LayoutId
*/
public abstract T getViewHolder(ViewGroup parent);
@Override
public void onBindViewHolder(T holder, int position) {
holder.itemView.setTag(getItem(position));
}
/**
* Item点击
*/
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(v, (E) v.getTag());
}
}
/**
* LongItem点击
*/
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
mOnItemLongClickListener.onItemLongClick(v, (E) v.getTag());
}
return false;
}
/**
* 返回Item数量
*/
@Override
public int getItemCount() {
return items != null ? items.size() : 0;
}
/**
* 返回Item
*/
public E getItem(int position) {
return items != null ? items.get(position) : null;
}
/**
* 返回所有Items
*
* @return
*/
public List<E> getItems() {
return items;
}
/**
* 增加单个Item
*
* @param newItem
*/
public void additem(E newItem) {
if (null == items) {
items = new ArrayList<>();
}
items.add(newItem);
notifyDataSetChanged();
}
/**
* 增加多个Item
*
* @param newItems
*/
public void addItems(List<E> newItems) {
if (null == items) {
items = new ArrayList<>();
}
items.addAll(newItems);
notifyDataSetChanged();
}
/**
* 设置Items
* 将原有集合内的所有元素删除
*
* @param newItems
*/
public void setItems(List<E> newItems) {
if (null == items) {
items = new ArrayList<>();
} else {
items.clear();
}
items.addAll(newItems);
notifyDataSetChanged();
}
/**
* 删除所有Items
*/
public void removeItems() {
removeItems(true);
}
public void removeItems(boolean isNotifyDataSetChanged) {
if (null == items) {
return;
}
items.clear();
if (isNotifyDataSetChanged) {
notifyDataSetChanged();
}
}
public void removeItem(E item) {
if (null == items || items.isEmpty()) {
return;
}
items.remove(item);
notifyDataSetChanged();
}
/**
* 返回LayoutInflater
*/
protected LayoutInflater getLayoutInflater() {
return LayoutInflater.from(mActivity.get());
}
public void setOnItemClickListener(OnItemClickListener<E> mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener<E> mOnItemLongClickListener) {
this.mOnItemLongClickListener = mOnItemLongClickListener;
}
/**
* 点击事件
*/
public interface OnItemClickListener<E> {
void onItemClick(View v, E e);
}
/**
* 长按事件
*/
public interface OnItemLongClickListener<E> {
void onItemLongClick(View v, E e);
}
}
分页适配器 对page操作封装 PagingRecyclerAdapter.class
public abstract class PagingRecyclerAdapter<T extends RecyclerView.ViewHolder, E>
extends BaseRecyclerAdapter<T, E> {
// 当前页数
private int indexPage = 0;
// 总页数
private int totalPage = 1;
/**
* @param ctx
*/
public PagingRecyclerAdapter(Activity ctx) {
super(ctx);
}
/**
* 结束加载更多
*/
public void finishLoadMore(int totalPage) {
this.indexPage += 1;
this.totalPage = totalPage;
}
/**
* 设置分页参数
*
* @param indexPage 当前页数
* @param totalPage 总页数
*/
public void setPaging(int indexPage, int totalPage) {
this.indexPage = indexPage;
this.totalPage = totalPage;
}
public void setPaging(int totalPage) {
this.indexPage += 1;
this.totalPage = totalPage;
}
public int getIndexPage() {
return indexPage;
}
public void setIndexPage(int indexPage) {
this.indexPage = indexPage;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
/**
* 重置
*/
public void reset() {
indexPage = 0;
totalPage = 1;
removeItems(false);
}
/**
* 获取下一页的页号
*/
public int getNextPage() {
return indexPage + 1;
}
/**
* 是否有更多
*/
public boolean hasMoreItems() {
return indexPage < totalPage;
}
}
使用方式:
新建一个adapter 类 集成 PagingRecyclerAdapter 明确 object。
public class xxxxAdapter extends PagingRecyclerAdapter<BuyBalanceListAdapter.ViewHolder, object>
怎么搭配刷新控件啦?
public void request(final boolean isRefresh){
if (isRefresh) {
adapter.reset();
}
Api.getInstance().getXXXApi().getList( adapter.getNextPage())
.compose(ApiSchedulersHelper.<Response<PageResult<Object>>>io_main())
.subscribe(new ResponseResultSubscriber<PageResult<Object>>(new FlippingLoadingDialog(mContext)) {
@Override
public boolean isShowDialog() {
return adapter.getIndexPage() == 0;
}
@Override
public void onResponse(PageResult<Object> result) {
if (isRefresh) {
adapter.setItems(result.data);
refreshLayout.finishRefresh();
} else {
adapter.addItems(result.data);
refreshLayout.finishLoadMore();
}
adapter.setPaging(result.last_page);
}
@Override
public void onError(int errorType, String msg) {
super.onError(errorType, msg);
refreshLayout.finishLoadMore(false);
}
});
}