我的应用实现了ListView。列表中的每个项目都会显示一张照片和一些文字。这些都是从互联网上下载的。我想为ListAdapter中指定的convertView提供我自己的自定义类,以便我可以在下载图像时更新它。但是,我无法弄清楚如何提供View的替代方法(我创建了一个扩展视图的子类,但是当我更改了默认方法签名时
View getView(int position, View convertView, ViewGroup parent)
到
View getView(int position, MyViewClass convertView, ViewGroup parent)
我遇到了编译错误。
如何为convertView提供我自己的类?
答案 0 :(得分:0)
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
模式。因此,您将拥有单一视图类型,并且对于每种情况,您将决定要执行的操作(触发下载,从缓存/标清卡中获取图像或显示默认图像)。为了更好地考虑这一点,我相信您需要在适配器实现中使用单独的结构,但不要在ViewHolder
中,因为ViewHolder
对象将与循环视图绑定。
上面的代码(添加重载的View getView(int position, MyViewClass convertView, ViewGroup parent)
)应该编译,除非你有一个@Override
注释。如果没有注释,您将拥有一个不会被调用的重载方法。