I would like to provide my own custom class for the convertView
如果您的适配器需要两种或更多类型的视图ListView
,那么您需要在适配器中覆盖getViewTypeCount()
和getItemViewType
. 第一种方法返回您将拥有的视图类型,而第二种方法返回当前项目位置应该拥有的视图类型。就像是:
abstract class MyListAdapter implements ListAdapter {
/**
* Set this up in your constructor
* */
private Context context;
private static final int VIEW_TYPE_SUPERMAN = 1;
private static final int VIEW_TYPE_BATMAN = 2;
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public int getItemViewType(int position) {
if(position % 2 == 0) { // your business logic
return VIEW_TYPE_BATMAN;
}
return VIEW_TYPE_SUPERMAN;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
if(convertView == null) {
if(viewType == VIEW_TYPE_BATMAN) {
convertView = LayoutInflater.from(context).inflate(resource_id_for_batman, parent);
} else {
convertView = LayoutInflater.from(context).inflate(resource_id_for_superman, parent);
}
// setup a ViewHolder pattern implementation
} else {
// get your ViewHolder from convertView
}
// update your views from ViewHolder
return convertView;
}
}
延伸阅读:so that I can update it when an image has downloaded
。因此,您不需要单独的视图和类型。您只需要知道每个项目(基于其位置)是否:图像未下载、图像下载失败、下载正在进行或图像已下载。所以我会ViewHolder
通过添加这条信息来实现这个模式。因此,您将拥有一个单一的视图类型,并且对于每种情况,您将决定做什么(触发下载、从缓存/SD 卡中获取图像或显示默认图像)。为了更好地考虑这一点,我相信您需要在适配器实现中拥有一个单独的结构,但不需要,ViewHolder
因为该ViewHolder
对象将与回收的视图相关联。
View getView(int position, MyViewClass convertView, ViewGroup parent)
除非您有@Override
注释,否则上面的代码(添加重载)应该可以编译。如果没有注释,您将拥有一个不会被调用的重载方法。