看了网上几篇,按照着搞都没成,后面自己搞了一个,还行吧,勉强够用,用到的是多布局,还有自己一个简单处理的Adapter的基类。说这么多,先上图:
以上就是两个效果图有数据和没有数据。废话不说,直接上代码:
1、Adapter:
/**
* 带有空视图设置的RecycleAdapter的积累
* Created by Administrator on 2018/7/31.
*/
public abstract class RecycleAdapterCopy<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
//上下文
public Context context;
//Item的点击事件
private OnRecycleItemListener onRecycleItemListener;
//item长按事件
private OnRecycleItemLongListener onRecycleItemLongListener;
//控件的点击事件
private OnViewClickListener onViewClickListener;
//头部Item的总数
private int headerCount;
//空视图的类型
public static final int VIEW_TYPE_EMPTY = -1;
public RecycleAdapterCopy(Context context) {
this.context = context;
}
@NonNull
@Override
public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_EMPTY) {
return getEmptyHolder(parent);
}
return onCreateHolder(parent, viewType);
}
@Override
public void onBindViewHolder(@NonNull final VH holder, final int position) {
//数据为空不做任何操作
if (getItemViewType(position) != VIEW_TYPE_EMPTY) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onRecycleItemListener != null) {
onRecycleItemListener.OnItemClick(v, position);
}
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onRecycleItemLongListener != null) {
return onRecycleItemLongListener.OnItemLongClick(v, position);
}
return false;
}
});
onBindViewData(holder, position);
}
}
@Override
public int getItemCount() {
headerCount = getHeaderCount();
int count = getCount();
if (headerCount <= count) { //防止设置了头部个数但是数据源是空的导致越界
if (count == 0 || count - headerCount == 0) {
//headerCount = -1 的时候没有空视图
// headerCount>=0 在主要数据为空的时候显示空视图
return headerCount + 1;
}
}
return count;
}
@Override
public int getItemViewType(int position) {
int count = getCount();
if (headerCount >= 0) {//是否是需要显示空视图
if (count - headerCount == 0 && position == headerCount) {//确定position是否是空视图项
return VIEW_TYPE_EMPTY;
}
}
return getItemType(position);
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
final RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if (manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
Log.e("TAG_OOPP",">>>>>>>>>> "+(getItemViewType(position) == VIEW_TYPE_EMPTY));
if (getItemViewType(position) == VIEW_TYPE_EMPTY) {
//空视图时一个占领所有列数
return ((GridLayoutManager) manager).getSpanCount();
}
return getItemSpanSize(position);
}
});
}
}
/**
* 布局管理
*/
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
/**
* 返回Item的类型
*/
public int getItemType(int position){
return super.getItemViewType(position);
}
/**
* 返回数据源的item总数
*/
public abstract int getCount();
/**
* 返回头布局的个数
*/
public int getHeaderCount() {
//默认返回0 表示有空视图 但是没有头布局 返回-1 表示没有空视图
return 0;
}
/**
* 获取网格布局一个Item占用多少列
*/
public int getItemSpanSize(int position) {
return 0;
}
/**
* 数据绑定
*/
public abstract void onBindViewData(VH holder, int position);
/**
* 绑定Item布局
*/
public abstract VH onCreateHolder(@NonNull ViewGroup parent, int viewType);
/**
* 设置空视图布局
*
* @param parent
* @return
*/
public abstract VH getEmptyHolder(ViewGroup parent);
/**
* 产生ViewHolder的View
*/
public View getItemView(ViewGroup parent, int res) {
return LayoutInflater.from(context).inflate(res, parent, false);
}
/**
* 产生ViewHolder的View
*/
public View getItemView(ViewGroup parent, int res, boolean attachToRoot) {
return LayoutInflater.from(context).inflate(res, parent, attachToRoot);
}
/**
* Item点击事件监听
*/
public void setOnRecycleItemListener(OnRecycleItemListener onRecycleItemListener) {
this.onRecycleItemListener = onRecycleItemListener;
}
/**
* 长按事件监听
*
* @param onRecycleItemLongListener
*/
public void setOnRecycleItemLongListener(OnRecycleItemLongListener onRecycleItemLongListener) {
this.onRecycleItemLongListener = onRecycleItemLongListener;
}
/**
* Item的View的点击事件监听
*
* @param onViewClickListener
*/
public void setOnViewClickListener(OnViewClickListener onViewClickListener) {
this.onViewClickListener = onViewClickListener;
}
}
这个是被我简单处理的基类
2、用法:
@Override
public int getCount() {
return mDesignItems.size();
}
@Override
public void onBindViewData(RecycleAdapterCopy.ViewHolder holder, int position) {
//这个是和原来数据绑定一样,如果你想给空视图加点东西可以判断是否是空视图,然后在对应的Holder上设置就好了
}
@Override
public RecycleAdapterCopy.ViewHolder onCreateHolder(@NonNull ViewGroup parent, int viewType) {
//这就是我有数据时显示列表的布局(自己去写自己的)
return new DesignViewHolder(getItemView(parent, R.layout.list_item_test, false));
}
@Override
public RecycleAdapterCopy.ViewHolder getEmptyHolder(ViewGroup parent) {
//这是返回空视图的Holder 我只显示了一张图片,所以就这样,有需要的,可以自己创建对应的空视图布局然后建立对应的Holder
return new ViewHolder(getItemView(parent, R.layout.layout_empty, false));
}
//注意了 如果你不想要空视图的话,getEmptyHolder方法只返回null是不行的,要重写有个方法:getHeaderCount 并且返回-1
注意!注意!注意!
注意了 如果你不想要空视图的话,getEmptyHolder方法只返回null是不行的,要重写有个方法:getHeaderCount 并且返回-1
好了,就是这样了,其余的还是和之前的操作一样的。
还有个小问题:如果用到多布局实现添加Recycle人View的Head 的时候, 我们要重写getHeaderCount 返回的 值是有多少个固定头部的个数
好了,能能力不是太强,写的有点凌乱,也没有大神那样的神操作,现阶段能解决自己遇到问题的方法,分享给大家。
联系方式QQ:915832847 E:wx_bin@sina.com