public abstract class BasePageAdapter<T, K extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<K> {
protected LayoutInflater inflater;
protected Context context;
protected List<T> listData;
private int spanRow = 1; // 行数
private int spanColumn = 7; // 每页列数
private int itemWidth = 0;
private int itemCount = 0;
private int pageMargin = 0; // 页间距
private BaseRecyclerAdapter.OnItemClickListener onItemClickListener;
private BaseRecyclerAdapter.OnClickListener onClickListener;
public BasePageAdapter(Context context, List<T> listData) {
this.context = context;
this.listData = listData;
this.inflater = LayoutInflater.from(context);
itemCount = listData.size() + spanRow * spanColumn;
initListener();
}
/**
* 初始化listener
*/
private void initListener() {
onClickListener = new BaseRecyclerAdapter.OnClickListener() {
@Override
public void onClick(int position, long itemId) {
if (onItemClickListener != null)
onItemClickListener.onItemClick(position, itemId);
}
};
}
@Override
public K onCreateViewHolder(ViewGroup parent, int viewType) {
if (itemWidth <= 0) {
// 计算Item的宽度
itemWidth = (parent.getWidth() - pageMargin * 2) / spanColumn;
}
final K holder = onCreateCustomViewHolder(parent, viewType);
if (holder != null) {
holder.itemView.setTag(holder);
holder.itemView.setOnClickListener(onClickListener);
}
holder.itemView.measure(0, 0);
holder.itemView.getLayoutParams().width = itemWidth;
holder.itemView.getLayoutParams().height = holder.itemView.getMeasuredHeight();
return holder;
}
@Override
public void onBindViewHolder(K holder, int position) {
if (null == holder) return;
if (spanColumn == 1) {
// 每个Item距离左右两侧各pageMargin
holder.itemView.getLayoutParams().width = itemWidth + pageMargin * 2;
holder.itemView.setPadding(pageMargin, 0, pageMargin, 0);
} else {
int m = position % (spanRow * spanColumn);
if (m < spanRow) {
// 每页左侧的Item距离左边pageMargin
holder.itemView.getLayoutParams().width = itemWidth + pageMargin;
holder.itemView.setPadding(pageMargin, 0, 0, 0);
} else if (m >= spanRow * spanColumn - spanRow) {
// 每页右侧的Item距离右边pageMargin
holder.itemView.getLayoutParams().width = itemWidth + pageMargin;
holder.itemView.setPadding(0, 0, pageMargin, 0);
} else {
// 中间的正常显示
holder.itemView.getLayoutParams().width = itemWidth;
holder.itemView.setPadding(0, 0, 0, 0);
}
}
if (position < listData.size()) {
holder.itemView.setVisibility(View.VISIBLE);
onBindCustomViewHolder(holder, position);
} else {
holder.itemView.setVisibility(View.INVISIBLE);
}
}
public int getPageCount() {
return itemCount;
}
@Override
public int getItemCount() {
return null == listData ? 0 : listData.size();
}
public abstract K onCreateCustomViewHolder(ViewGroup parent, int viewType);
public abstract void onBindCustomViewHolder(K h, int position);
public interface OnItemClickListener {
void onItemClick(int position, long itemId);
}
/**
* 添加项点击事件
*
* @param onItemClickListener the RecyclerView item click listener
*/
public void setOnItemClickListener(BaseRecyclerAdapter.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
/**
* 可以共用同一个listener,相对高效
*/
public static abstract class OnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) v.getTag();
onClick(holder.getAdapterPosition(), holder.getItemId());
}
public abstract void onClick(int position, long itemId);
}
public void replaceItem(T item) {
if (null != listData) {
listData.clear();
listData.add(item);
}
}
public void replaceItem(List<T> items) {
if (null != listData) {
listData.clear();
listData.addAll(items);
}
}
public void addItem(T item) {
if (null != listData) listData.add(item);
}
public void addItem(List<T> items) {
if (null != listData) listData.addAll(items);
}
public void deleteItem(int position) {
if (null != listData && null != listData.get(position)) listData.remove(position);
}
public void deleteItem(T item) {
if (null != listData) listData.remove(item);
}
public void clearItem() {
if (null != listData) listData.clear();
}
public void refresh() {
notifyItemChanged(listData.size() - 1);
}
}