前言
RecyclerView很好用,但是有没有觉得写RecyclerView.Adapter的时候,每次都要多出一个Adapter类,很麻烦?如果我想快速构建一个列表,我是不是可以采用更直观地办法?
万能Adapter登场
声明:此框架是大佬所创,据说是洪洋大神。我只是记一下笔记··
源码:
package com.example.rv;
/**
* date : 2020/8/12_9:49
* desc :
* version: 1.0
*/
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
/**
* RecyclerView万能适配器
*
* @author zhouhang
* @param
*/
public abstract class RecyclerViewUniversalAdapter extends RecyclerView.Adapter {
protected Context mContext;
protected int mLayoutId;
protected List mDatas;
protected LayoutInflater mInflater;
protected ViewGroup mRv;
private OnItemClickListener mOnItemClickListener;
public final RecyclerViewUniversalAdapter setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
return this;
}
public OnItemClickListener getmOnItemClickListener() {
return this.mOnItemClickListener;
}
public RecyclerViewUniversalAdapter(Context context, List datas, int layoutId) {
this.mContext = context;
this.mInflater = LayoutInflater.from(context);
this.mLayoutId = layoutId;
this.mDatas = datas;
}
public final ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder viewHolder = ViewHolder.get(this.mContext, (View) null, parent, this.mLayoutId);
if (null == this.mRv) {
this.mRv = parent;
}
return viewHolder;
}
protected final int getPosition(ViewHolder viewHolder) {
return viewHolder.getAdapterPosition();
}
protected boolean isEnabled(int viewType) {
return true;
}
/**
* @deprecated
*/
@Deprecated
protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) {
if (this.isEnabled(viewType)) {
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (RecyclerViewUniversalAdapter.this.mOnItemClickListener != null) {
int position = RecyclerViewUniversalAdapter.this.getPosition(viewHolder);
RecyclerViewUniversalAdapter.this.mOnItemClickListener.onItemClick(parent, v, RecyclerViewUniversalAdapter.this.mDatas.get(position), position);
}
}
});
viewHolder.itemView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (RecyclerViewUniversalAdapter.this.mOnItemClickListener != null) {
int position = RecyclerViewUniversalAdapter.this.getPosition(viewHolder);
return RecyclerViewUniversalAdapter.this.mOnItemClickListener.onItemLongClick(parent, v, RecyclerViewUniversalAdapter.this.mDatas.get(position), position);
} else {
return false;
}
}
});
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
this.setListener(position, holder);
this.convert(holder, this.mDatas.get(position));
}
protected void setListener(final int position, final ViewHolder viewHolder) {
if (this.isEnabled(this.getItemViewType(position))) {
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (RecyclerViewUniversalAdapter.this.mOnItemClickListener != null) {
RecyclerViewUniversalAdapter.this.mOnItemClickListener.onItemClick(RecyclerViewUniversalAdapter.this.mRv, v, RecyclerViewUniversalAdapter.this.mDatas.get(position), position);
}
}
});
viewHolder.itemView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (RecyclerViewUniversalAdapter.this.mOnItemClickListener != null) {
int position = RecyclerViewUniversalAdapter.this.getPosition(viewHolder);
return RecyclerViewUniversalAdapter.this.mOnItemClickListener.onItemLongClick(RecyclerViewUniversalAdapter.this.mRv, v, RecyclerViewUniversalAdapter.this.mDatas.get(position), position);
} else {
return false;
}
}
});
}
}
/**
* 将 var2的数据 显示在ViewHolder 的对应 View 中
* @param var1
* @param var2
*/
public abstract void convert(ViewHolder var1, T var2);
@Override
public int getItemCount() {
return this.mDatas != null ? this.mDatas.size() : 0;
}
public void setDatas(List list) {
if (this.mDatas != null) {
if (null != list) {
ArrayList temp = new ArrayList();
temp.addAll(list);
this.mDatas.clear();
this.mDatas.addAll(temp);
} else {
this.mDatas.clear();
}
} else {
this.mDatas = list;
}
this.notifyDataSetChanged();
}
public void remove(int i) {
if (null != this.mDatas && this.mDatas.size() > i && i > -1) {
this.mDatas.remove(i);
this.notifyDataSetChanged();
}
}
public void addDatas(List list) {
if (null != list) {
ArrayList temp = new ArrayList();
temp.addAll(list);
if (this.mDatas != null) {
this.mDatas.addAll(temp);
} else {
this.mDatas = temp;
}
this.notifyDataSetChanged();
}
}
public List getDatas() {
return this.mDatas;
}
public T getItem(int position) {
return position > -1 && null != this.mDatas && this.mDatas.size() > position ? this.mDatas.get(position) : null;
}
public interface OnItemClickListener {
void onItemClick(ViewGroup var1, View var2, T var3, int var4);
boolean onItemLongClick(ViewGroup var1, View var2, T var3, int var4);
}
}
package com.example.rv;
/**
* date : 2020/8/12_9:50
* desc :
* version: 1.0
*/
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.util.Linkify;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.widget.AbsListView;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
/**
* @author zhouhang
*/
public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray mViews = new SparseArray();
private int mLayoutId;
public ViewHolder(View itemView) {
super(itemView);
}
public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId) {
if (convertView == null) {
View holder2 = LayoutInflater.from(context).inflate(layoutId, parent, false);
ViewHolder holder1 = new ViewHolder(holder2);
holder1.mLayoutId = layoutId;
return holder1;
} else {
ViewHolder holder = (ViewHolder) convertView.getTag();
return holder;
}
}
public int getLayoutId() {
return this.mLayoutId;
}
public T getView(int viewId) {
View view = (View) this.mViews.get(viewId);
if (view == null) {
view = this.itemView.findViewById(viewId);
this.mViews.put(viewId, view);
}
return (T) view;
}
public ViewHolder setText(int viewId, CharSequence text) {
TextView tv = (TextView) this.getView(viewId);
tv.setText(text);
return this;
}
public ViewHolder setSelected(int viewId, boolean selected) {
View v = this.getView(viewId);
v.setSelected(selected);
return this;
}
public ViewHolder setImageResource(int viewId, int resId) {
ImageView view = (ImageView) this.getView(viewId);
view.setImageResource(resId);
return this;
}
public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
ImageView view = (ImageView) this.getView(viewId);
view.setImageBitmap(bitmap);
return this;
}
public ViewHolder setImageDrawable(int viewId, Drawable drawable) {
ImageView view = (ImageView) this.getView(viewId);
view.setImageDrawable(drawable);
return this;
}
public ViewHolder setBackgroundColor(int viewId, int color) {
View view = this.getView(viewId);
view.setBackgroundColor(color);
return this;
}
public ViewHolder setBackgroundRes(int viewId, int backgroundRes) {
View view = this.getView(viewId);
view.setBackgroundResource(backgroundRes);
return this;
}
public ViewHolder setTextColor(int viewId, int textColor) {
TextView view = (TextView) this.getView(viewId);
view.setTextColor(textColor);
return this;
}
public ViewHolder setTextColorRes(int viewId, int textColorRes) {
TextView view = (TextView) this.getView(viewId);
view.setTextColor(this.itemView.getContext().getResources().getColor(textColorRes));
return this;
}
@SuppressLint({"NewApi"})
public ViewHolder setAlpha(int viewId, float value) {
if (Build.VERSION.SDK_INT >= 11) {
this.getView(viewId).setAlpha(value);
} else {
AlphaAnimation alpha = new AlphaAnimation(value, value);
alpha.setDuration(0L);
alpha.setFillAfter(true);
this.getView(viewId).startAnimation(alpha);
}
return this;
}
public ViewHolder setVisible(int viewId, boolean visible) {
View view = this.getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return this;
}
public ViewHolder linkify(int viewId) {
TextView view = (TextView) this.getView(viewId);
Linkify.addLinks(view, Linkify.ALL);
return this;
}
public ViewHolder setTypeface(Typeface typeface, int... viewIds) {
int[] var3 = viewIds;
int var4 = viewIds.length;
for (int var5 = 0; var5 < var4; ++var5) {
int viewId = var3[var5];
TextView view = (TextView) this.getView(viewId);
view.setTypeface(typeface);
view.setPaintFlags(view.getPaintFlags() | 128);
}
return this;
}
public ViewHolder setProgress(int viewId, int progress) {
ProgressBar view = (ProgressBar) this.getView(viewId);
view.setProgress(progress);
return this;
}
public ViewHolder setProgress(int viewId, int progress, int max) {
ProgressBar view = (ProgressBar) this.getView(viewId);
view.setMax(max);
view.setProgress(progress);
return this;
}
public ViewHolder setMax(int viewId, int max) {
ProgressBar view = (ProgressBar) this.getView(viewId);
view.setMax(max);
return this;
}
public ViewHolder setRating(int viewId, float rating) {
RatingBar view = (RatingBar) this.getView(viewId);
view.setRating(rating);
return this;
}
public ViewHolder setRating(int viewId, float rating, int max) {
RatingBar view = (RatingBar) this.getView(viewId);
view.setMax(max);
view.setRating(rating);
return this;
}
public ViewHolder setTag(int viewId, Object tag) {
View view = this.getView(viewId);
view.setTag(tag);
return this;
}
public ViewHolder setTag(int viewId, int key, Object tag) {
View view = this.getView(viewId);
view.setTag(key, tag);
return this;
}
public ViewHolder setChecked(int viewId, boolean checked) {
Checkable view = (Checkable) this.getView(viewId);
view.setChecked(checked);
return this;
}
public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) {
View view = this.getView(viewId);
view.setOnClickListener(listener);
return this;
}
public ViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {
View view = this.getView(viewId);
view.setOnTouchListener(listener);
return this;
}
public ViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
View view = this.getView(viewId);
view.setOnLongClickListener(listener);
return this;
}
public void setItemVisible(boolean visible) {
if (null != this.itemView) {
if (visible) {
if (null != this.itemView.getLayoutParams()) {
this.itemView.getLayoutParams().width = -1;
this.itemView.getLayoutParams().height = -2;
} else {
this.itemView.setLayoutParams(new AbsListView.LayoutParams(-1, -2));
}
this.itemView.setVisibility(View.VISIBLE);
} else {
if (null != this.itemView.getLayoutParams()) {
this.itemView.getLayoutParams().width = -1;
this.itemView.getLayoutParams().height = 1;
} else {
this.itemView.setLayoutParams(new AbsListView.LayoutParams(-1, 1));
}
this.itemView.setVisibility(View.GONE);
}
}
}
public void setHItemVisible(boolean visible) {
if (null != this.itemView) {
if (visible) {
if (null != this.itemView.getLayoutParams()) {
this.itemView.getLayoutParams().width = -2;
this.itemView.getLayoutParams().height = -2;
} else {
this.itemView.setLayoutParams(new AbsListView.LayoutParams(-1, -2));
}
this.itemView.setVisibility(View.VISIBLE);
} else {
if (null != this.itemView.getLayoutParams()) {
this.itemView.getLayoutParams().width = -1;
this.itemView.getLayoutParams().height = 1;
} else {
this.itemView.setLayoutParams(new AbsListView.LayoutParams(-1, 1));
}
this.itemView.setVisibility(View.GONE);
}
}
}
}
使用方法:
如果不用这个万能Adapter,我们需要创建一个 class MyAdapter extends RecyclerView.Adapter
,然后重写 onCreateViewHolder / onBindViewHolder,还要自己创一个ViewHolder内部类,简直罗嗦。现在有了万能Adapter,比之前省心多了 。
这次只是记个笔记,以后用的时候拷贝就行。欧了!