需求:每一个列表,需要写一个数据适配器,每次没啥太大变化,太麻烦了。
结论:因为ListView和RecyclerView的数据适配器的结构不太一样。所以,分为以下两种:ListView版和RecyclerView版。
ListView版:
package com.deepreality.universalbaseadapter; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; /** * ListView的简单通用适配器 * @param <T> */ public abstract class LViewUniversalBaseAdapter<T> extends BaseAdapter { private ArrayList<T> mData; private int mLayoutRes; //布局id public LViewUniversalBaseAdapter(ArrayList<T> mData, int mLayoutRes) { this.mData = mData; this.mLayoutRes = mLayoutRes; } @Override public int getCount() { return mData != null ? mData.size() : 0; } @Override public T getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, mLayoutRes , position); bindView(holder, position); return holder.getItemView(); } public abstract void bindView(ViewHolder holder, int position); public static class ViewHolder { private SparseArray<View> mViews; //存储ListView 的 item中的View private View item; //存放convertView private int position; //游标 private Context context; //Context上下文 //构造方法,完成相关初始化 private ViewHolder(Context context, ViewGroup parent, int layoutRes) { mViews = new SparseArray<>(); this.context = context; View convertView = LayoutInflater.from(context).inflate(layoutRes, parent, false); convertView.setTag(this); item = convertView; } //绑定ViewHolder与item public static ViewHolder bind(Context context, View convertView, ViewGroup parent, int layoutRes, int position) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(context, parent, layoutRes); } else { holder = (ViewHolder) convertView.getTag(); holder.item = convertView; } holder.position = position; return holder; } public <T extends View> T getView(int id) { T t = (T) mViews.get(id); if (t == null) { t = (T) item.findViewById(id); mViews.put(id, t); } return t; } /** * 获取当前条目 */ public View getItemView() { return item; } /** * 获取条目位置 */ public int getItemPosition() { return position; } /** * 设置文字 */ public ViewHolder setText(int id, CharSequence text) { View view = getView(id); if (view instanceof TextView) { ((TextView) view).setText(text); } return this; } /** * 设置图片 */ public ViewHolder setImageResource(int id, int drawableRes) { View view = getView(id); if (view instanceof ImageView) { ((ImageView) view).setImageResource(drawableRes); } else { view.setBackgroundResource(drawableRes); } return this; } /** * 设置点击监听 */ public ViewHolder setOnClickListener(int id, View.OnClickListener listener) { getView(id).setOnClickListener(listener); return this; } /** * 设置可见 */ public ViewHolder setVisibility(int id, int visible) { getView(id).setVisibility(visible); return this; } /** * 设置标签 */ public ViewHolder setTag(int id, Object obj) { getView(id).setTag(obj); return this; } //其他方法可自行扩展 } }
RecyclerView版:
package com.deepreality.universalbaseadapter; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; /** * RecyclerView的简单通用适配器 * @param <T> */ public abstract class RViewUniversalBaseAdapter<T> extends RecyclerView.Adapter<RViewUniversalBaseAdapter.ViewHolder> { private ArrayList<T> mData; private int mLayoutRes; public RViewUniversalBaseAdapter(ArrayList<T> mData, int mLayoutRes) { this.mData = mData; this.mLayoutRes = mLayoutRes; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return ViewHolder.getHolder(mLayoutRes, parent, viewType); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { bindView(holder, position); } public abstract void bindView(ViewHolder holder, int position); @Override public int getItemCount() { return mData != null ? mData.size() : 0; } static class ViewHolder extends RecyclerView.ViewHolder { private SparseArray<View> mViews = new SparseArray<>(); //存储ListView 的 item中的View public final View itemView; public ViewHolder(View itemView) { super(itemView); if (itemView == null) { throw new IllegalArgumentException("itemView may not be null"); } this.itemView = itemView; } public static ViewHolder getHolder(int mResId, ViewGroup parent, int viewType) { ViewHolder holder; View view = LayoutInflater.from(parent.getContext()).inflate(mResId, parent, false); holder = new ViewHolder(view); return holder; } public <T extends View> T getView(int id) { T t = (T) mViews.get(id); if (t == null) { t = (T) itemView.findViewById(id); mViews.put(id, t); } return t; } /** * 设置文字 */ public ViewHolder setText(int id, CharSequence text) { View view = getView(id); if (view instanceof TextView) { ((TextView) view).setText(text); } return this; } /** * 设置图片 */ public ViewHolder setImageResource(int id, int drawableRes) { View view = getView(id); if (view instanceof ImageView) { ((ImageView) view).setImageResource(drawableRes); } else { view.setBackgroundResource(drawableRes); } return this; } /** * 设置点击监听 */ public ViewHolder setOnClickListener(int id, View.OnClickListener listener) { getView(id).setOnClickListener(listener); return this; } /** * 设置可见 */ public ViewHolder setVisibility(int id, int visible) { getView(id).setVisibility(visible); return this; } /** * 设置标签 */ public ViewHolder setTag(int id, Object obj) { getView(id).setTag(obj); return this; } } }
如何使用适配器呢?
(备注:RecyclerView和ListView使用方法一致!)
appRViewUniversalBaseAdapter = new RViewUniversalBaseAdapter<App>((ArrayList<App>) mData1, R.layout.item_one) { @Override public void bindView(ViewHolder holder, int position) { holder.setImageResource(R.id.img_icon, mData1.get(position).get_img_icon()); holder.setText(R.id.txt_aname, mData1.get(position).get_txt_aname()); holder.setOnClickListener(R.id.txt_aname, new MyClickListener(position)); } }; lvApp.setAdapter(appRViewUniversalBaseAdapter);
PS:如何向给RecyclerView添加分割线呢?
//添加Android自带的分割线 rViewBook.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));