最近闲来无事,看着之前开发的工程项目,Adapter被不同开发人员写得五花八门,于是花了点时间整理了一下,大部分情况下都可以通用
不仅支持单一item,还支持多类型的item。
1. ViewHolder整理,根据View控件Id获取控件
public class CommonViewHolder {
private View itemView;
private SparseArray<View> views;//存放Item中的控件
private CommonViewHolder() {
views = new SparseArray<>();
}
private CommonViewHolder(View itemView) {
this();
this.itemView = itemView;
}
/**
* 获取ItemView
*
* @param cxt
* @param convertView
* @param parent
* @param layoutId 资源文件id
* @return
*/
public static CommonViewHolder getHolder(Context cxt, View convertView, ViewGroup parent, int layoutId, int itemViewType) {
if (null == convertView || null == convertView.getTag(itemViewType)) {
convertView = LayoutInflater.from(cxt).inflate(layoutId, parent, false);
convertView.setTag(itemViewType, new CommonViewHolder(convertView));
}
return (CommonViewHolder) convertView.getTag(itemViewType);
}
/**
* 根据Item中的控件Id获取控件
*/
public <V extends View> V getView(int viewId) {
View childView = views.get(viewId);
if (null == childView) {
childView = itemView.findViewById(viewId);
views.put(viewId, childView);
}
return (V) childView;
}
public View getConvertView() {
return itemView;
}
/**
* 根据Item中的控件Id向控件添加事件监听
*/
public void setOnClickListener(int viewId, View.OnClickListener listener) {
getView(viewId).setOnClickListener(listener);
}
}
2. 针对Adapter数据列表的整理,主要是对数据的增删改查
public interface ICommonAdapter<T> {
void add(T t);
void add(int position, T t);
void addAll(List<T> l);
void replace(int position, T t);
void remove(T t);
void remove(int position);
void clear();
void setData(List<T> l);
T getData(int position);
List<T> getData();
}
3. Adapter整理,继承了BaseAdapter 类和实现了ICommonAdapter接口,所有的操作在基类中处理
/**
* 通用adapter基类
*/
public abstract class CommonBaseAdapter<T> extends BaseAdapter implements ICommonAdapter<T> {
protected Context context;
private List<T> list;
private CommonBaseAdapter() {
list = new ArrayList<>();
}
public CommonBaseAdapter(Context context) {
this();
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public T getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int itemViewType = getItemViewType(position);
CommonViewHolder holder = CommonViewHolder.getHolder(context, convertView, parent, getItemLayoutId(itemViewType), itemViewType);
convertViewData(position, itemViewType, list.get(position), holder);
return holder.getConvertView();
}
@Override
public void add(T t) {
if (!list.contains(t)) {
list.add(t);
}
}
@Override
public void add(int position, T t) {
list.add(position, t);
}
@Override
public void addAll(List<T> l) {
for (T t : l) {
add(t);
}
}
@Override
public void replace(int position, T t) {
remove(position);
add(position, t);
}
@Override
public void remove(T t) {
if (list.contains(t)) {
list.remove(t);
}
}
@Override
public void remove(int position) {
list.remove(position);
}
@Override
public void clear() {
list.clear();
}
@Override
public void setData(List<T> l) {
clear();
addAll(l);
}
@Override
public T getData(int position) {
return list.get(position);
}
@Override
public List<T> getData() {
return list;
}
/**
* Item布局文件类型
*
* @param position
* @return
*/
public abstract int getItemViewType(int position);
/**
* 单个Item布局文件Id
*
* @param itemViewType 布局类型
* @return
*/
public abstract int getItemLayoutId(int itemViewType);
/**
* 数据处理
*
* @param position
* @param holder 用于获取控件,CommonViewHolder.getView(int layoutId);
*/
public abstract void convertViewData(int position, int itemViewType, T t, CommonViewHolder holder);
}
4.详解
当开发需要用到Adapter的时候,只需要继承CommonBaseAdapter类,实现里面的三个方法:
- 方法1:public abstract int getItemViewType(int position)–用于判断ItemView类型,如果类型单一的,就直接返回0,多个就返回类型id
- 方法2:public abstract int getItemLayoutId(int itemViewType)–用于获取资源文件,如果类型单一的,就直接返回一个布局id,多个就根据类型id返回布局文件id
方法3:public abstract void convertViewData(int position, int itemViewType, T t, CommonViewHolder holder)–用于处理View和数据的关联
5.案例1.类型单一情况
public class SampleAdapter extends CommonBaseAdapter<AppInfoBean> {
public SampleAdapter(Context context) {
super(context);
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public int getItemLayoutId(int itemViewType) {
return R.layout.about_us_item;
}
@Override
public void convertViewData(int position, int itemViewType, AppInfoBean c, CommonViewHolder holder) {
TextView tv = holder.getView(R.id.tv);
holder.setOnClickListener(R.id.tv, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
- 类型多样化情况
public class SampleAdapter extends CommonBaseAdapter<AppInfoBean> {
public SampleAdapter(Context context) {
super(context);
}
@Override
public int getItemViewType(int position) {
return getData().get(position).getType();
}
@Override
public int getItemLayoutId(int itemViewType) {
int layoutId = R.layout.about_us_item;
switch (itemViewType) {
case 0:
layoutId = R.layout.about_us_item;
break;
case 1:
layoutId = R.layout.about_us_item;
break;
}
return layoutId;
}
@Override
public void convertViewData(int position, int itemViewType, AppInfoBean c, CommonViewHolder holder) {
switch (itemViewType) {
case 0:
TextView tv = holder.getView(R.id.tv);
break;
case 1:
ImageView iv = holder.getView(R.id.iv);
holder.setOnClickListener(R.id.iv, new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
break;
}
}
}