我使用带有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模式更多的是重用视图,这样您就不必再次搜索它们,但是有什么方法可以扩展它以满足我的需求呢?我能想到的唯一解决方案是创建一个隐藏的视图,并将这个整数填充到它的文本字段中,稍后我可以检索它,但我希望有一个不那么麻烦的解决方案。
发布于 2012-07-26 17:10:33
ViewHolder模式更多的是重用视图,这样您就不必再次搜索它们,但是有没有什么方法可以扩展它来满足我的需求呢?
这是正确的,持有者模式用于在每次需要显示一行时缓存查找视图。也许我不明白你想要做什么,但是如下所示:
我正尝试在我的ViewHolder中存储一个整数,它对应于游标列中的值。稍后,我想遍历我的ListView中的所有项,并提取出这个值。
为什么不能简单地引用下划线的Cursor( CursorAdapter具有getCursor方法),遍历它并提取所需的值(在阅读代码后,它似乎就是行的id )?您可以始终在适配器内部存储来自cursor的所需值的数组/列表。此数组/列表将在bindView中更新,因此其中包含正确的值。
发布于 2012-07-26 17:02:15
您可以将其填充到GroupCheckedTextView的tag字段中。
https://stackoverflow.com/questions/11665708
复制相似问题