1

我已经实现了一个分段列表视图,因此每个部分都有一个使用本指南的适配器,并且可能会导致视图在滚动时一遍又一遍地分配,而不是因为有不同的适配器而重用(但是当回滚时,它会重用但对于同一个适配器),它的 getView 方法是这样的(简化):

        Map< String, ? > object = null;
        String id = null, title = null, rating = null, pic_url = null;
        object = sectionContent.get(position).getMap();
        id = (String) object.get(EventRowValues.ROW_ID);
        title = (String) object.get(EventRowValues.ROW_TITLE);
        pic_url = (String) object.get(EventRowValues.ROW_PIC_URL);

        View hView = convertView;
        if ( hView == null ) {
            hView = mInflater.inflate(R.layout.popularity_row, null);
            ViewHolder holder = new ViewHolder();
            holder.pic = (ImageView) hView.findViewById(R.id.icon);
            holder.title = (TextView) hView.findViewById(R.id.label);
            hView.setTag(holder);
        }

        final ViewHolder holder = (ViewHolder) hView.getTag();

        holder.id = id;

        mImageWorker.loadImage(pic_url, holder.pic);

        holder.title.setText(title);

        return hView;

loadImage 方法来自这个谷歌示例

问题是当我滚动时它会占用越来越多的内存,例如 2 MB 用于 5-10 行。当我向后滚动时,它不会占用更多内存,但据我所知,它不应该分配如此多的内存,因为它会重用视图,因为我希望它在加载时以及滚动以使用时占用内存来自缓存的相同视图和位图(因为大部分可绘制对象是从缓存返回的相同对象)。

可能是什么问题?还有其他更智能的可重用分段列表视图选项吗?

非常感谢。

4

3 回答 3

2

想通了,我使用的是我之前提到的指南中的分段表格视图,它不会正确重用单元格。我已经实现了一个带有一些补丁的 ExpandableListView 以使其工作,现在它很棒。

谢谢。

于 2012-06-07T16:36:42.393 回答
2

试试这个:更新:

        ViewHolder holder = new ViewHolder();

        if ( convertView == null ) {
            holder = new ViewHolder();
            hView = mInflater.inflate(R.layout.popularity_row, null);
            holder.pic = (ImageView) hView.findViewById(R.id.icon);
            holder.title = (TextView) hView.findViewById(R.id.label);
            hView.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

PS:您已经创建了两次持有人对象。真的需要吗?

您使用的是哪个android版本,因为我也遇到了同样的问题,我使用的是11版,在更高版本上,如果您希望能够快速滚动列表,您需要在清单文件中提供android:hardwareAccelerated="true"属性。activity tag

于 2012-06-06T09:36:33.960 回答
1

注释掉 mImageWorker.loadImage(pic_url, holder.pic); 并显示内存消耗的差异

于 2012-06-06T09:28:58.243 回答