0

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

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

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

我得到一个编译错误。

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

4

1 回答 1

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通过添加这条信息来实现这个模式。因此,您将拥有一个单一的视图类型,并且对于每种情况,您将决定做什么(触发下载、从缓存/SD 卡中获取图像或显示默认图像)。为了更好地考虑这一点,我相信您需要在适配器实现中拥有一个单独的结构,但不需要,ViewHolder因为该ViewHolder对象将与回收的视图相关联。

View getView(int position, MyViewClass convertView, ViewGroup parent)除非您有@Override注释,否则上面的代码(添加重载)应该可以编译。如果没有注释,您将拥有一个不会被调用的重载方法。

于 2013-07-26T10:03:01.697 回答