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メソッドは、このgoogleの例からのものです。

問題は、スクロールすると、より多くのメモリが必要になることです。たとえば、5〜10行の場合は2MBです。スクロールして戻ると、それ以上のメモリは必要ありませんが、ロード時とスクロールして使用するときにメモリを消費すると予想されるため、ビューを再利用するため、このような量のメモリを割り当てる必要はありません。キャッシュからの同じビューとビットマップ(ドローアブルの多くはキャッシュから返された同じオブジェクトであるため)。

何が問題なのか?よりスマートに再利用可能なセクション化されたlistViewへの他のオプションはありますか?

どうもありがとう。

4

3 に答える 3

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:ホルダーオブジェクトを2回作成しました。本当に必要ですか?

どのAndroidバージョンを使用していますか、coz私も同じ問題を抱えていました。バージョン11を使用していました。より高いバージョンでは、リストをすばやくスクロールできるようにする場合は、マニフェストファイルでandroid:hardwareAccelerated="true"属性を指定する必要があります。activity tag

于 2012-06-06T09:36:33.960 に答える
2

それを理解した、私は前に述べたガイドからの断面表ビューを使用していました、そしてそれはセルを適切に再利用しません。私はそれを機能させるためにいくつかのパッチでExpandableListViewを実装しました、そして今それは素晴らしいです。

ありがとう。

于 2012-06-07T16:36:42.393 に答える
1

mImageWorker.loadImage(pic_url、holder.pic);をコメントアウトします。とメモリ消費の違いを示しています

于 2012-06-06T09:28:58.243 に答える