1

我正在使用带有 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 的解决方案。

4

2 回答 2

1

ViewHolder 模式更多的是关于重用视图,因此您不必再次搜索它们,但是有没有办法扩展它以使用我想要的东西?

没错,持有者模式用于在每次需要显示一行时缓存查找视图。也许我不明白您要做什么,但是请注意:

我试图在我的 ViewHolder 中存储一个整数,该整数对应于我的光标列中的一个值。稍后我想遍历我的 ListView 中的所有项目并提取这个值。

为什么你不能简单地获得对下划线的引用Cursor(aCursorAdaptergetCursor方法),跳过它并提取你想要的值(在阅读你的代码之后,这似乎是id行的值)?您始终可以在适配器内部存储来自游标的所需值的数组/列表。此数组/列表将在 中更新,bindView以便您在其中拥有正确的值。

于 2012-07-26T09:10:32.777 回答
0

你可以把它塞进tag你的GroupCheckedTextView.

于 2012-07-26T09:02:14.857 回答