为ListView的convertView提供自定义类

时间:2013-07-26 09:40:25

标签: android

我的应用实现了ListView。列表中的每个项目都会显示一张照片和一些文字。这些都是从互联网上下载的。我想为ListAdapter中指定的convertView提供我自己的自定义类,以便我可以在下载图像时更新它。但是,我无法弄清楚如何提供View的替代方法(我创建了一个扩展视图的子类,但是当我更改了默认方法签名时

View getView(int position, View convertView, ViewGroup parent)

View getView(int position, MyViewClass convertView, ViewGroup parent)

我遇到了编译错误。

如何为convertView提供我自己的类?

1 个答案:

答案 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注释。如果没有注释,您将拥有一个不会被调用的重载方法。