一般来说,一个ListView的Adapter是继承自BaseAdapter,然后改写其中的getCount()、getItem()、getItemId()、getView()等方法。其中最重要的是getView()方法,其他的几个方法基本上实现的过程类似,这就提供了抽取出公共方法的可行性。
那么,至于最重要的getView()方法,可采取另一套解决方法。
下面是常规的方法,采用viewholder,根据ID找到具体view,然后再进行操作
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
GalleryView gv = null;
if(arg1 == null) {
gv = new GalleryView();
arg1 = ViewContainer.inflate(R.layout.gallery, null);
gv.iv = (ImageView) arg1.findViewById(R.id.typeimageview);
arg1.setTag(gv);
}else {
gv = (GalleryView) arg1.getTag();
}
gv.iv.setImageResource(pic[arg0 % pic.length]);
gv.iv.setAdjustViewBounds(true);
return arg1;
}
那么先考虑把getView方法抽取出来。
通常为了节省资源,用一个ViewHolder储存View,然后对具体的View进行操作。
先编写一个ViewHolder类。(可以直接复制到项目里面用,还可以根据自己的需要来添一些代码,可参考setText等方法)
package org.out.sh.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
/**
* Created by Hao_S on 2015/4/28.
*/
public class ViewHolder {
private SparseArray<View> mViews;
private int mPosition;
private View mConvertView;
public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
this.mPosition = position;
this.mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
mConvertView.setTag(this);
}
public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutId, position);
} else {
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.mPosition = position;
return viewHolder;
}
}
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if(view ==null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId,view);
}
return (T) view;
}
public View getConvertView() {
return mConvertView;
}
public ViewHolder setText(int viewId, String text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
public ViewHolder setImageView (int viewId, int resId) {
ImageView imageView = getView(viewId);
imageView.setImageResource(resId);
return this;
}
public ViewHolder setImageView(int viewId, Bitmap bitmap) {
ImageView imageView = getView(viewId);
imageView.setImageBitmap(bitmap);
return this;
}
public ViewHolder setImageView(int viewId, String url) {
ImageView imageView = getView(viewId);
// volley
return this;
}
public ViewHolder setRatingBar(int viewId, int numStars, int rating) {
RatingBar ratingBar = getView(viewId);
ratingBar.setNumStars(numStars);
ratingBar.setRating(rating);
return this;
}
}
CommonAdapter,重点看getVIew里面的ViewHolder的使用。
package org.out.sh.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.List;
/**
* Created by NarutoSong on 2015/4/28.
*
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
protected Context context;
protected List<T> datas;
protected LayoutInflater layoutInflater;
private int layoutId;
public CommonAdapter(Context context,int layoutId, List<T> datas) {
this.context = context;
layoutInflater.from(context);
this.datas = datas;
this.layoutId = layoutId;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public T getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.get(context, convertView, parent, layoutId, position);
convert(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convert(ViewHolder viewHolder, T t);
}
在使用的时候,继承CommonAdapter,实现convert方法。
@Override
public void convert(ViewHolder viewHolder, Code code) {
viewHolder.setText(R.id.username, code.getUsername());
}