1

私のアプリには、2 種類のアイテムを含むリストを表示するために使用される ListView があります。現在実装されている方法は、項目タイプごとに 2 つの異なる XML レイアウトがあることです。アダプターはタイプを正しく報告し、getView() メソッドで、指定された位置のタイプに従って適切な XML を膨らませます。

問題は、ほとんどの場合、アイテムのリストの構造が、タイプ 1 アイテムのほとんどが最初にあり、タイプ 2 アイテムのほとんどが最後にあるということです。そのため、通常、最初はほとんどタイプ 1 が表示されます。下にスクロールすると、ある時点でタイプ 2 の項目が表示され始め、リストの最後まで続きます。

その中間点に達するまでスクロールしている間、すべて正常に機能します。その時点で、getView() へのすべての呼び出しで、convertView パラメーターとして null が渡されます。これは明らかに理にかなっています。問題は、ListView が以前のタイプ 1 のビューをすべてリサイクラーに格納しているように見えることです。これからはほとんどのビューがタイプ 2 のビューになるため、下にスクロールし続ける限り、それらを使用しません。

ビューは非常に複雑で、カスタムの背景とその上にビットマップがあるため、おそらく使用しないであろう多くのビューがメモリ内に存在することになります。

私の質問は 2 つあります。

  1. 私はそれについて心配する必要がありますか?今のところ、私は OOM 例外を取得する段階ではありませんが、そこに到達するか、またはリソースが逼迫したときにそれらのビューの一部を「手放す」のに十分なほど ListView がスマートですか?

  2. 私がそれについて心配する必要がある場合、明示的に ListView にリサイクラーをクリアするように指示したり、何らかの方法で無効にしたりする方法はありますか?

考えられる解決策は、両方のレイアウトに同じ XML を使用し、そこに 2 つの ViewGroup を配置し、そのうちの 1 つの可視性を GONE に設定することです。それ。

4

3 に答える 3

1

Adapterで 2 つの異なるタイプの子ビューを処理するための 1 つの提案は、メソッドを使用しgetViewTypeCountて、実際に 2 つの異なるタイプのビューを使用していることをアダプターに知らせることです。

listView は各ビュー タイプごとに各リサイクラーを維持するため (この場合、数は 2 になります)、OOM 例外を心配する必要はなく、ListView にリサイクラーをクリアするように指示する必要もありません。

詳細な説明については、ArrayAdapter の getViewTypeCount および getItemViewType メソッドを確認してください。

実装のためのコード スニペット:

public class SampleAdapter extends ArrayAdapter<String> {

    ...

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        //the result must be in the range 0 to getViewTypeCount() - 1.
        if( position < 10 )
            return 0;
        else
            return 1;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        switch( getItemViewType(position) ){
            case 0:
                //do something for type1 view.
                break;
            case 1:
                //do something for type2 view.
                break;
        }
        return convertView;
    }
}
于 2013-09-16T23:39:56.523 に答える
1

私はそれについて心配する必要がありますか?

いいえ、ユーザーは完全に上にスクロールできるため、タイプ 1 の行に戻ります。

今のところ、私は OOM 例外を取得する段階ではありませんが、そこに到達するか、またはリソースが逼迫したときにそれらのビューの一部を「手放す」のに十分なほど ListView がスマートですか?

OutOfMemoryErrorメッセージの受信を開始すると、これListViewは問題になりません。非常に多くの行View構造しかなく、メモリ消費の観点からはすべてが非常に安価である必要があります。

于 2013-09-16T23:48:26.443 に答える