继承RecyclerView的Adapter适配器的封装,可以参考学习
有点击,长按,添加head,foot
,动态添加数据(上拉加载更多),刷新数据(下拉刷新)
上个代码:
public abstract class MagicRecyclerViewHFAdapter<T ,V extends MagicRecyclerViewHFAdapter.ItemHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_FOOTER = 1;
private static final int TYPE_ITEM = 2;
private static final int TYPE_EMPTY = 3;
private View mHeaderView;
private View mFooterView;
private View mEmptyView;
public List<T> items;
public Context mContext ;
/**
* 设置item布局
* @return
*/
public abstract int setLayoutItemID();
/**
* 设置item的ViewHolder 继承ItemHolder
* @return
*/
public abstract V addViewItemHolder(View v);
/**
* 设置item的数据
* @return
*/
public abstract void onBindViewHolderT(RecyclerView.ViewHolder holder, int position, T dataItem);
public OnItemClickLitener mOnItemClickLitener;
public OnItemLongClickLitener mOnItemLongClickLitener;
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
this.mOnItemClickLitener = mOnItemClickLitener;
}
public void setOnItemLongClickLitener(OnItemLongClickLitener mOnItemLongClickLitener) {
this.mOnItemLongClickLitener = mOnItemLongClickLitener;
}
public MagicRecyclerViewHFAdapter(Context mContext , List<T> data) {
this.mContext = mContext;
this.items = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View v = LayoutInflater.from(parent.getContext())
.inflate(setLayoutItemID(), parent, false);
final V holder = addViewItemHolder(v);
if (mOnItemClickLitener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
int pos = holder.getLayoutPosition();
mOnItemClickLitener.onItemClickList(holder.itemView, pos);
}
});
}
if (mOnItemLongClickLitener != null) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = holder.getLayoutPosition();
mOnItemLongClickLitener.onItemLongClickList(holder.itemView, pos);
return false;
}
});
}
return holder;
} else if (viewType == TYPE_HEADER) {
View v = mHeaderView;
return new HeaderHolder(v);
} else if (viewType == TYPE_FOOTER) {
View v = mFooterView;
return new FooterHolder(v);
} else if (viewType == TYPE_EMPTY) {
View v = mEmptyView;
return new EmptyHolder(v);
}
throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemHolder) {
T dataItem = getItem(position);
onBindViewHolderT(holder,position ,dataItem);
} else if (holder instanceof HeaderHolder) {
} else if (holder instanceof FooterHolder) {
} else if (holder instanceof EmptyHolder) {
}
}
@Override
public int getItemCount() {
int count;
int size = items.size();
if (size == 0 && null != mEmptyView) {
count = 1;
} else {
count = getHeadViewSize() + size + getFooterViewSize();
}
return count;
}
@Override
public int getItemViewType(int position) {
int size = items.size();
if (size == 0 && null != mEmptyView) {
return TYPE_EMPTY;
} else if (position < getHeadViewSize()) {
return TYPE_HEADER;
} else if (position >= getHeadViewSize() + items.size()) {
return TYPE_FOOTER;
}
return TYPE_ITEM;
}
public int getHeadViewSize() {
return mHeaderView == null ? 0 : 1;
}
public int getFooterViewSize() {
return mFooterView == null ? 0 : 1;
}
public T getItem(int position) {
return items.get(position - getHeadViewSize());
}
//add a header to the adapter
public void addHeader(View header) {
mHeaderView = header;
notifyItemInserted(0);
}
//remove a header from the adapter
public void removeHeader(View header) {
notifyItemRemoved(0);
mHeaderView = null;
}
//add a footer to the adapter
public void addFooter(View footer) {
mFooterView = footer;
notifyItemInserted(getHeadViewSize() + items.size());
}
//remove a footer from the adapter
public void removeFooter(View footer) {
notifyItemRemoved(getHeadViewSize() + items.size());
mFooterView = null;
}
//add data
public void addDatas(List<T> data) {
items.addAll(data);
notifyItemInserted(getHeadViewSize() + items.size() - 1);
}
//add data
public void addData(T data) {
items.add(data);
notifyItemInserted(getHeadViewSize() + items.size() - 1);
}
//refresh data
public void refreshData(List<T> datas){
items.clear();
addDatas(datas);
}
public void setEmptyView(View emptyView) {
mEmptyView = emptyView;
notifyItemInserted(0);
}
public interface OnItemClickLitener{
void onItemClickList(View view, int position);
}
public interface OnItemLongClickLitener{
void onItemLongClickList(View view, int position);
}
public class ItemHolder<T> extends RecyclerView.ViewHolder {
public ItemHolder(View itemView) {
super(itemView);
}
}
public class HeaderHolder<T> extends RecyclerView.ViewHolder {
public HeaderHolder(View itemView) {
super(itemView);
}
}
class FooterHolder<T> extends RecyclerView.ViewHolder {
public FooterHolder(View itemView) {
super(itemView);
}
}
class EmptyHolder<T> extends RecyclerView.ViewHolder {
public EmptyHolder(View itemView) {
super(itemView);
}
}
}
使用:
CustomShopRecyclerViewHFAdapter :设置自己的entity
public class CustomShopRecyclerViewHFAdapter<String> extends MagicRecyclerViewHFAdapter {
public CustomShopRecyclerViewHFAdapter(Context mContext, List data) {
super(mContext, data);
}
@Override
public int setLayoutItemID() {
return R.layout.adapter_shop_item;
}
@Override
public ShopItemHolder addViewItemHolder(View view) {
return new ShopItemHolder(view);
}
@Override
public void onBindViewHolderT(RecyclerView.ViewHolder holder, int position, Object dataItem) {
((ShopItemHolder) holder).tv_content.setText("lmz,这个味确实");
Glide.with(mContext).load("http://www.32190.com/images/goods/20130702/5ec240a4f8a31693.gif").into(((ShopItemHolder) holder).mImage);
}
//继承这个holder
public class ShopItemHolder<T> extends ItemHolder {
ImageView mImage;
TextView tv_content;
TextView tv_price;
TextView tv_num;
public ShopItemHolder(View mView) {
super(mView);
mImage = (ImageView) mView.findViewById(R.id.shop_img);
tv_content = (TextView) mView.findViewById(R.id.shop_content);
tv_price = (TextView) mView.findViewById(R.id.shop_price);
tv_num = (TextView) mView.findViewById(R.id.shop_num);
}
}
}
在补充一下,判断加载到了底部:
public class RecyclerViewUtils {
LoadingData data;
public void loadingData(LoadingData data){
this.data = data ;
};
public interface LoadingData {
void onLoadMore();
}
public static void OnScrollListener(final LoadingData data, RecyclerView recyclerView) {
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = manager.getItemCount();
if (lastVisibleItem == (totalItemCount - 1) && !isSlidingToLast) {
data.onLoadMore();//当滑动到底部的时候触动这个方法
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dx > 0) {
isSlidingToLast = true;
} else {
isSlidingToLast = false;
}
}
});
}
}