0

カスタムadapterでは、再構成する必要があるかどうかを知る方法convertViewは?

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {
        imageView = (ImageView) mInflater.inflate(R.layout.avatar, parent, false);

        // Should this 2 lines of code be here ?
        User user = mUserList.getUserAt(position);
        user.setAvatar(imageView);
    } else {
        imageView = (ImageView) convertView;
    }

    // or here ?
    User user = mUserList.getUserAt(position);
    user.setAvatar(imageView);

    return imageView;
}

リサイクルすれば、ユーザーのアバターをリセットする必要はないと思いますが、ifブロックの外で設定が行われているのをよく目にします。何故ですか?

4

3 に答える 3

2

私は常にブロックの外側でビューを構成しますif。getViewメソッドで取得するこのconvertViewは、アイテムビューが画面外に出たときに再利用するというListViewのポリシーにより、getViewへの以前の呼び出しによって別のユーザー用に設定される可能性があります(おそらくそうなるでしょう)。適切なアバターを設定しないと、このアイテムのアバターが間違ってしまいます。もちろん、背景などの具体的な位置に依存しないプロパティをリセットする必要はありません。

たとえば、CursorAdapterは、 getViewを2つの部分に分割します。newViewは膨張と(ほとんど)位置に依存しないセットアップを実行し、bindViewは実際の位置に依存するデータを割り当てます。

また、以前にこのポジションで使用したのとまったく同じビューが表示される場合もあります。もちろん、この場合はビューのリセットを回避できますが、このビューのデータが有効かどうかを確認する必要があります。ビューのタグを設定して確認することが、最も明白な解決策として頭に浮かびます。

于 2012-12-25T04:48:54.977 に答える
2

真にリサイクルされているわけではありません。つまり、「リサイクルされた」ビューに、新しい位置に応じて新しいデータを入力する必要があるということです。そうしないと、この行は、その位置をスクロールして離れたために画面に表示されなくなった古いデータで埋められます。

つまり、getView()が呼び出されるたびに(ifコードのブロック外で)、新しいデータを使用してビューを再構成する必要があります。

于 2012-12-25T07:05:01.140 に答える
1

あなたの問題はリストビューの理解だけにあります。

それで、ここでそれがどのように機能するかを明確にしますか?

リストビューには20個のアイテムが含まれている必要がありますが、現在の画面では8個のアイテム(リストアイテム、この場合はimageview)しか収容(画面に表示)できないとします。

リストビューがアイテムを取得しようとすると、オブジェクトのリサイクルがまだ行われていないため、1----8th返さconvertViewれます。null

しかし、あなたがスクロールしようとすると、私たちの場合(上にスクロール!)。

the 1st element of the list will be recycled when go out of screen, and will be supplied as convertView for 9th item.

このように、listviewは、任意の数のアイテムを表示するために8番目(この場合)のみを管理する必要があります。

下にスクロールすると、逆のことが起こります。

したがって、変換ビュー(nullかどうか)に基づいて、作成して塗りつぶすか、塗りつぶすかのいずれかでロジックを設計する必要があります。

これがお役に立てば幸いです。

于 2012-12-27T07:08:00.973 に答える