我正在使用带有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模式更多的是重用视图,因此您不必再次搜索它们,但有没有办法扩展它以满足我的需求?我能想到的唯一解决方案是创建一个隐藏的视图,并将这个整数填充到它的文本字段中,我可以稍后检索它,但我希望有一个不太常见的解决方案。
答案 0 :(得分:1)
ViewHolder模式更多的是重用视图而不是重复 必须再次搜索它们,但有没有办法将它扩展到 按照我想要的方式工作?
这是正确的,持有人模式用于在每次需要显示行时缓存查找视图。也许我不明白你想做什么,但是跟着:
我正在尝试在我的ViewHolder中存储一个与a对应的整数 我的光标列中的值。后来我想迭代所有的 我的ListView中的项目并提取此值。
为什么你不能简单地获得对下划线Cursor
的引用(CursorAdapter
有getCursor
方法),跳过它并提取你想要的值(之后,阅读你的代码,似乎是行的id
?您始终可以在适配器内部存储光标所需值的数组/列表。此数组/列表将在bindView
中更新,因此您可以在其中包含正确的值。
答案 1 :(得分:0)
您可以将其填入tag
的{{1}}字段。