如何在ViewHolder中存储原始值?

时间:2012-07-26 08:53:51

标签: android android-listview xamarin.android

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

2 个答案:

答案 0 :(得分:1)

  

ViewHolder模式更多的是重用视图而不是重复   必须再次搜索它们,但有没有办法将它扩展到   按照我想要的方式工作?

这是正确的,持有人模式用于在每次需要显示行时缓存查找视图。也许我不明白你想做什么,但是跟着:

  

我正在尝试在我的ViewHolder中存储一个与a对应的整数   我的光标列中的值。后来我想迭代所有的   我的ListView中的项目并提取此值。

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

答案 1 :(得分:0)

您可以将其填入tag的{​​{1}}字段。