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