0

newView() と bindView() がオーバーライドされた CursorAdapter があります。問題は、bindView() が newView() によって作成されたビューに正しくマップされないことです。

newView() は、以下のように、カーソル値に従って異なるレイアウトから膨張した 2 つの異なるビューを返します。

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent){
    View view = null;
    int who = //... get a value from cursor

    switch(who){
    case 0:
        view = LayoutInflater.from(context).inflate(R.layout.first, null);
        view.setTag("case 0"); // for bindView() mapping inspection
        break;
    case 1:
        view = LayoutInflater.from(context).inflater(R.layout.second, null);
        view.setTag("case 1"); // for bindView() mapping inspection
        break;
    default:
        break;
    }
    return view;
}

次に、bindView() は通常どおりです。カーソルから値を取得し、newView() から返されたビューの UI 要素に値を設定します。特にない。newView() で設定されたビューのタグを示す bindView() にログを配置しました。ログは、 bindView() が呼び出されたときに目的のビューを取得しないことを示しています。

bindView() が呼び出されると、メモリ効率のために既存のビューがあればバインドすると思いました。したがって、bindView はおそらく行 _ID で識別される特定のビューを取得すると考えました。しかし、それが呼び出されると、既存のビューを取得するだけのようです。

ビューが異なるレイアウトを持つことができる場合、bindView が特定のレイアウトで指定されたビューを取得するようにするにはどうすればよいですか?

4

1 に答える 1

3

デフォルトでは、ListView 内のすべての項目が同じビュー タイプと見なされます。getItemViewTypeをオーバーライドして、位置に基づいて異なる値を返すことができます。その後、ビューは同じアイテム ビュー タイプに対してのみ再利用されます。

また、 getViewTypeCountをオーバーライドすることもできます。そうしないと機能しgetItemViewTypeません。

于 2013-05-02T04:46:10.120 に答える