1

ViewHolder パターンと CursorAdapter を使用して、ListView を作成しています。カーソルの列の値に対応する整数を ViewHolder に格納しようとしています。後で、ListView 内のすべての項目を反復処理して、この値を引き出したいと思います。

ただし、CursorAdapter がビューをリサイクルすると、ViewHolder の整数値が更新されないようです。

CursorAdapter の関連コードを次に示します (私は Mono For Android を使用しているため、コードは C# ですが、考え方は同じです)。

    public override void BindView(View view, Context context, ICursor cursor)
    {
        var viewHolder = view.Tag as ViewHolder;

        if (viewHolder.GroupCheckedTextView != null)
        {
            viewHolder.GroupCheckedTextView.Text = cursor.GetString(ColumnMapping["Name"]);
        }

        if (viewHolder.FieldTextView != null)
        {
            viewHolder.FieldTextView.Text = cursor.GetString(ColumnMapping["Value"]);
            viewHolder.LabelTextView.Text = cursor.GetString(ColumnMapping["Label"]) ?? cursor.GetString(ColumnMapping["TypeLabel"]);
        }

        // I tried updating it manually, but it doesn't stick...
        //viewHolder.GroupId = cursor.GetInt(ColumnMapping["GroupId"]);
        //view.Tag = viewHolder;
    }

    public override View NewView(Context context, ICursor cursor, ViewGroup parent)
    {
        var inflator = LayoutInflater.FromContext(context);
        View view = null;

        if (IsNewGroup(cursor, cursor.Position))
        {
            view = inflator.Inflate(Resource.Layout.Group, parent, false);
        }
        else
        {
            view = inflator.Inflate(Resource.Layout.Field, parent, false);
        }

        var viewHolder = new ViewHolder(view);
        viewHolder.GroupId = cursor.GetInt(ColumnMapping["GroupId"]);
        view.Tag = viewHolder;

        return view;
    }

理由はわかると思います。ViewHolder パターンは、ビューを再利用するためのものであるため、それらを再度検索する必要はありませんが、それを拡張して必要なもので動作させる方法はありますか? 私が考えることができる唯一の解決策は、隠しビューを作成し、この整数をテキストフィールドに詰め込むことです。これは後で取得できますが、ハックの少ない解決策があることを願っています。

4

2 に答える 2

1

ViewHolder パターンは、ビューを再利用するためのものであるため、それらを再度検索する必要はありませんが、それを拡張して必要なもので動作させる方法はありますか?

その通りです。ホルダー パターンは、行を表示する必要があるたびにビューを探してキャッシュするために使用されます。あなたが何をしようとしているのか理解できなかったかもしれませんが、次のとおりです。

カーソルの列の値に対応する整数を ViewHolder に格納しようとしています。後で、ListView 内のすべての項目を反復処理して、この値を引き出したいと思います。

下線への参照を簡単に取得できずCursor(aCursorAdapterにはgetCursorメソッドがあります)、それをステップオーバーして、必要な値を抽出できません(コードを読んだ後id、行のように見えます)? カーソルからの目的の値の配列/リストをアダプターに常に内部的に保存できます。この配列/リストは で更新されるbindViewため、正しい値が含まれます。

于 2012-07-26T09:10:32.777 に答える
0

tagのフィールドに詰め込むことができますGroupCheckedTextView

于 2012-07-26T09:02:14.857 に答える