3

どのように機能するかを理解するために、いくつかの記事を読み、ビデオListViewを見ました。では、5 つのアイテムを含むリストがあるとします (すべてのアイテムが画面に表示されます)。から継承したカスタム アダプターに次のコードがありますBaseAdapter

@Override
public View getView(int position, View view, ViewGroup parent) {
    System.out.println("item position: " + position + " view " + view);

    if (view == null)
    {
        view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null);
    }
    return view;
}

このコードを実行すると、コンソールに次の出力が表示されます。

08-26 14:52:40.882: item position: 0 view null
08-26 14:52:40.883: item position: 1 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.883: item position: 2 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 0 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 1 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 2 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 0 view android.widget.RelativeLayout{88bc756 V.E...C.. ......I. 0,0-1080,65 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 1 view android.widget.RelativeLayout{1264e60 V.E...C.. ......I. 0,68-1080,133 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 2 view android.widget.RelativeLayout{36b089 V.E...C.. ......I. 0,136-1080,201 #7f0e00b8 app:id/item_container}
08-26 14:52:40.884: item position: 3 view android.widget.RelativeLayout{e1a12bb V.E...C.. ......I. 0,204-1080,269 #7f0e00b8 app:id/item_container}
08-26 14:52:40.885: item position: 4 view android.widget.RelativeLayout{ab5ffdd V.E...C.. ......I. 0,0-0,0 #7f0e00b8 app:id/item_container}

getView() viewはポジションnullだけです。0見た後、私nullは最初の 5 回の呼び出し (表示されているすべてのアイテム ビューが初期化されないまで) を持っていると思いました。なぜ最初だけ?私は何が欠けていますか?

4

2 に答える 2

1

ListViewnullビューをリサイクルするので、ビューを膨らませる必要があるため、最初の実行になります。ビューを拡張したら、同じビューを再利用し、コンテンツを更新してパフォーマンスを向上させる必要があります。次のビデオを見ることをお勧めします https://www.youtube.com/watch?v=wDBM6wVEO70、リストビューのしくみをよく説明しています。

于 2016-08-26T15:10:03.633 に答える
0

これは、ビューのファクトリ メソッドです。複雑なビューを何度も作成しないようにするために、作成したビューを返し、後でフレームワークによってパラメーターとして受け取ることができます。

ビューを再利用できるかどうか (たとえば、異なるライン ビジュアライゼーションがある場合は型が一致するかどうか) を確認してから、新しいビューを作成する (新しいビューを拡張する) 代わりに、パフォーマンス上の理由から単にビューを使用する必要があります。

ビュー インフレーションには、XML の解析が含まれます。コストのかかる操作です。そのため、API を使用してコンポーネントを再利用できます。UI開発でよくあるパターンです。

そのため、最初の呼び出しで null が発生し、後でビューのインスタンスで発生します。

于 2016-08-26T15:05:20.787 に答える