在开发的过程中,常常会用到ViewPager、ListView、GridView等、这些带有Item的视图控件,而这些控件有个共同点就是都要用到它们的适配器,我们在实现视图展示时,一般都会去写个自定义的适配器去继承PagerAdapter或Adapter或Adapter的子类,因为Android源码自带的这些适配器都比较抽象,往往在我们开发时,写的一些自定义适配器都需要重写Adapter父类的一些方法,在重写时,有很多较通用性的代码,比较耦合,所以我们来看一下封装:
图片加载框架我用的ImageLoader,所以需要到一个包(自己去查一下)
首先初始化:
public class App extends Application{
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration build = new ImageLoaderConfiguration.Builder(this).build();
ImageLoader.getInstance().init(build);
}
}
清单文件注册
android:name=".App"
下面直接看封装的适配器
首先ViewHolder:
public class ViewHolder {
//当map的键是integer类型时可以用SparseArray优化
private SparseArray<View> views ;
private View convertView;
private static ViewHolder holder;
// resid是视图文件
public ViewHolder(Context context,int resId){
views = new SparseArray<>();
if(convertView==null){
convertView = View.inflate(context,resId,null);
convertView.setTag(this);
}else
{
holder = (ViewHolder) convertView.getTag();
}
}
public static ViewHolder getViewHolder(Context context,int resId){
holder = new ViewHolder(context,resId);
return holder;
}
public <T extends View>View getView(int resId){
View view = views.get(resId);
if(view==null){
view = convertView.findViewById(resId);
views.put(resId,view);
return (T)view;
}
return (T)view;
}
public View getConvertView(){
return convertView;
}
Adapter:
public abstract class CommonAdapter<T> extends BaseAdapter {
protected Context context;
protected List <T> list;
protected int laoutid;
public CommonAdapter(Context context, List<T> list,int laoutid) {
this.context = context;
this.list = list;
this.laoutid = laoutid;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder=ViewHolder.getViewHolder(context,laoutid);
convert(holder,list.get(i),i);
return holder.getConvertView();
}
public abstract void convert(ViewHolder holder,T t,int i);
}
//封装完成后我们在写适配器就只需要继承与我们自己封装的适配器
public class CategoryAdapter extends CommonAdapter<Categary> {
public CategoryAdapter(Context context, List<Categary> list, int laoutid) {
super(context, list, laoutid);
}
@Override
public void convert(ViewHolder holder, Categary categary, int i) {
ImageView img = (ImageView) holder.getView(R.id.img);
TextView tv = (TextView) holder.getView(R.id.tv);
ImageLoader.getInstance().displayImage(list.get(i).getIcon(),img);
tv.setText(list.get(i).getName());
}
}
在里面只写跟我们实际逻辑有关的就可以了
这里加载图片因网络慢会导致卡顿
我们可以在清单文件中application下添加硬件加速:
android:hardwareAccelerated="true"