一、概述
实现万能适配器,基于通用ViewHolder。
链接:http://blog.youkuaiyun.com/qq_27993003/article/details/51447283
二、设想
Adapter要通用,首先要抽象的是:数据(抽象成List),getCount()、getItemId()、getItem()可以直接在抽象类实现,然后是重要的getView()方法…
分析getView()方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.getViewHolder(context, parent, R.layout.item_1,
position, convertView);
viewHolder.setText(R.id.itemTitle, datas.get(position).getTitle())
.setText(R.id.itemContent, datas.get(position).getContent());
return viewHolder.getConvertView();
}
第一行:特殊的在R.layout.item_1,设计:把这个layoutId通过构造器传进来
第二行:两个参数都是特性的,用抽象方法convert()封装
第三行:直接抽象类实现
新的getView()方法设计:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.getViewHolder(context, parent, mItemLayoutId,
position, convertView);
convertViewHolder(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convertViewHolder(ViewHolder viewHolder, T item);
三、代码实现
通用接口:
package com.example.barbara.commonadapterexample;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.List;
/**
* 万能Adapter
* @param <T>
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
private Context context;
private List mDatas;
private LayoutInflater mLayoutInflater;
private int mItemLayoutId;
public CommonAdapter(Context mcontext, List<T> mDatas, int mItemLayoutId) {
mLayoutInflater = LayoutInflater.from(mcontext);
this.context = mcontext;
this.mDatas = mDatas;
this.mItemLayoutId = mItemLayoutId;
}
@Override
public int getCount() {
return (mDatas==null)?-1:mDatas.size();
}
@Override
public T getItem(int position) {
return (mDatas==null)?null:(T) mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.getViewHolder(context, parent, mItemLayoutId,
position, convertView);
convertViewHolder(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convertViewHolder(ViewHolder viewHolder, T item);
}
MainActivity调用:
//直接匿名内部类,重写一个方法就OK!
listView.setAdapter(new CommonAdapter<ItemBean>(this, list, R.layout.item_1){
@Override
public void convertViewHolder(ViewHolder viewHolder, ItemBean item) {
viewHolder.setText(R.id.itemTitle, item.getTitle())
.setText(R.id.itemContent, item.getContent());
}
});