我的自定义适配器有时显示错误
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。
作为旁注,您可以查看 RecyclerView
和 ViewHolder
以更好地理解回收以及对代码进行一些可能的改进。
我确实为我的 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。
作为旁注,您可以查看 RecyclerView
和 ViewHolder
以更好地理解回收以及对代码进行一些可能的改进。