我的自定义适配器有时显示错误

My custom Adapter displays things sometimes wrong

我确实为我的 Android 应用程序(Xamarin,c#)编写了一个自定义适配器来显示 "Mods",其中包含一些值,例如名称、游戏等。在这里您可以看到它:

public class modAdapter : BaseAdapter<Mod>
{
    List<Mod> items;
    Activity context;

    public modAdapter(Activity context, List<Mod> items)
   : base()
    {
        this.context = context;
        this.items = items;
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override Mod this[int position]
    {
        get { return items[position]; }
    }

    public override int Count
    {
        get { return items.Count; }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        if (row == null)
            row = LayoutInflater.From(context).Inflate(Resource.Layout.modRow, null, false);

        row.FindViewById<TextView>(Resource.Id.textView1).Text = items[position].name;
        row.FindViewById<TextView>(Resource.Id.textView2).Text = items[position].game;

        if (items[position].favorited)
            row.FindViewById<ImageView>(Resource.Id.favIcon).Visibility = ViewStates.Visible;

        return row;
    }
}

我在 ListView 的行中添加了一个图标,如果用户将 mod 标记为收藏夹,该图标就会显示。项目列表是正确的,我调试和检查,我只有一个最喜欢的。

但奇怪的是,有时其他 mod 会被标记为收藏,即使它们没有标记在列表中。我认为当您滚动并且查看缺失的行时会发生这种情况。我调试并查看了何时调用图标可见的行,并且仅在加载正确的 mod 时调用它。还有一个(列表中的最后一个)获得了图标。

我是 Android 开发的新手,真心希望您能理解我的问题并提出解决此问题的一些想法。谢谢!

您的列表元素正在回收,因此一旦视图用于 "favorite",它就会将图标设置为可见。当该元素离开屏幕时,该元素的布局将在另一个元素上重用。该图标仍然可见

row.FindViewById<ImageView>(Resource.Id.favIcon).Visibility = ViewStates.Visible;

行。所以添加一个 else 块并将可见性设置回 hidden 或 gone。

作为旁注,您可以查看 RecyclerViewViewHolder 以更好地理解回收以及对代码进行一些可能的改进。