我正在使用带有 CursorAdapter 的 ViewHolder 模式来填充 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 模式更多的是关于重用视图,因此您不必再次搜索它们,但是有没有办法扩展它以使用我想要的东西?我能想到的唯一解决方案是创建一个隐藏视图并将这个整数填充到它的文本字段中,我可以稍后检索它,但我希望有一个不那么 hacky 的解决方案。