第一步:ViewHolder类 RecyclerView.java
public class RecyclerHolder extends RecyclerView.ViewHolder {
private final SparseArray<View> mViews;
public RecyclerHolder(View itemView) {
super(itemView);
//一般不会超过8个吧
this.mViews = new SparseArray<>(8);
}
public SparseArray<View> getAllView() {
return mViews;
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*
* @param viewId
* @return
*/
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
/**
* 为TextView设置字符串
*
* @param viewId
* @param text
* @return
*/
public RecyclerHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(CheckUtil.notNull(text));
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param drawableId
* @return
*/
public RecyclerHolder setImageResource(int viewId, int drawableId) {
ImageView view = getView(viewId);
view.setImageResource(drawableId);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param drawable
* @return
*/
public RecyclerHolder setImageDrawable(int viewId, Drawable drawable) {
ImageView view = getView(viewId);
view.setBackgroundDrawable(drawable);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param bm
* @return
*/
public RecyclerHolder setImageBitmap(int viewId, Bitmap bm) {
ImageView view = getView(viewId);
view.setImageBitmap(bm);
return this;
}
public RecyclerHolder setImageUrl(int viewId, String imgPath) {
ImageView view = getView(viewId);
ImageUtils.showImage(imgPath, view);
return this;
}
public void setVisibility(int viewId, int visibility) {
View view = getView(viewId);
view.setVisibility(visibility);
}
public void setOnClickListener(int viewId, View.OnClickListener listener) {
View view = getView(viewId);
view.setOnClickListener(listener);
}
}
第二步: 万能适配器类 BaseRecyclerViewAdapter.java
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerHolder> {
protected List<T> realDatas;
protected final int mItemLayoutId;
protected boolean isScrolling;
protected Context context;
private OnItemClickListener<T> listener;
private OnItemLongClickListener<T> longListener;
public interface OnItemClickListener<T> {
void onItemClick(View view, T data, int position);
}
public interface OnItemLongClickListener<T> {
void onItemLongClick(View view, T data, int position);
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public BaseRecyclerAdapter(RecyclerView v, Collection<T> datas, int itemLayoutId) {
if (datas == null) {
realDatas = new ArrayList<>();
} else if (datas instanceof List) {
realDatas = (List<T>) datas;
} else {
realDatas = new ArrayList<>(datas);
}
mItemLayoutId = itemLayoutId;
if (v != null) {
context = v.getContext();
}
}
/**
* Recycler适配器填充方法
*
* @param holder viewholder
* @param item javabean
* @param isScrolling RecyclerView是否正在滚动
*/
public abstract void convert(RecyclerHolder holder, T item, int position, boolean isScrolling);
@Override
public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View root = inflater.inflate(mItemLayoutId, parent, false);
return new RecyclerHolder(root);
}
@Override
public void onBindViewHolder(RecyclerHolder holder, int position) {
convert(holder, realDatas.get(position), position, isScrolling);
holder.itemView.setOnClickListener(getOnClickListener(position));
holder.itemView.setOnLongClickListener(getOnLongClickListener(position));
}
@Override
public int getItemCount() {
return realDatas.size();
}
public void setOnItemClickListener(OnItemClickListener<T> l) {
listener = l;
}
public void setOnItemLongClickListener(OnItemLongClickListener<T> lcl) {
longListener = lcl;
}
public View.OnClickListener getOnClickListener(final int position) {
return new View.OnClickListener() {
@Override
public void onClick(@Nullable View v) {
if (listener != null && v != null) {
listener.onItemClick(v, realDatas.get(position), position);
}
}
};
}
public View.OnLongClickListener getOnLongClickListener(final int position) {
return new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (longListener != null && v != null) {
longListener.onItemLongClick(v, realDatas.get(position), position);
}
return true;
}
};
}
public BaseRecyclerAdapter<T> refresh(List<T> datas) {
if (ListUtil.isNotEmpty(datas)) {
realDatas.clear();
}
realDatas.addAll(datas);
notifyDataSetChanged();
return this;
}
public void addMoreAll(List<T> datas) {
realDatas.addAll(datas);
notifyDataSetChanged();
}
public int getDataSize() {
return realDatas != null ? realDatas.size() : 0;
}
}
第三步: 一种Item分隔线的写法
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {
private int spanCount;
private int spacing;
private boolean includeEdge;
private int space;
public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
this.spanCount = spanCount;
this.spacing = spacing;
this.includeEdge = includeEdge;
}
//设置item间隔
public SpaceItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (parent.getChildPosition(view) != 0)
outRect.top = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
int column = position % spanCount; // item column
if (includeEdge) {
outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)
if (position < spanCount) { // top edge
outRect.top = spacing;
}
outRect.bottom = spacing; // item bottom
} else {
outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing)
if (position >= spanCount) {
outRect.top = spacing; // item top
}
}
}
}