【问题标题】:When I chose one item in ListView in Xamarin Android is choosen twin当我在 Xamarin Android 的 ListView 中选择一项时,选择了双胞胎
【发布时间】:2018-01-09 14:14:18
【问题描述】:

当我在 Xamarin Android 的 ListView 中选择一项时,选择了 twins 。在 Xamarin.Forms 中存在设置 ListView 的缓存策略:RetainElement 和 RecycleElement 。

С#

var listView = new ListView(ListViewCachingStrategy.RecycleElement);

XAML

<ListView CachingStrategy="RecycleElement">
<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
          ...
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>
</ListView>

如何在 Xamarin Android 中配置缓存?因为我有问题,当我在 ListView 中选择一些项目时,它在 ListView 的另一部分中选择了两次对称。我必须做些什么来解决这个问题?请有人说我!比你!

【问题讨论】:

  • 请详细说明或发布图片来描述您的问题。
  • York Shen-MSFT 想象一下屏幕中的 ListView。我触摸第一个项目,他正在改变背景。我向下滚动,我又选择了一个,当我选择更多项目时,我在 ListView 的另一部分得到对称选择的项目。问题出在 RecycleView 中。我认为索引是重复的。例如,如果我在适配器的程序中选择一个项目,他工作正常。但是当我在适配器中的 List 项目中选择时,我经常得到错误的项目。我如何与 RecycleView 合作,或者离开他?
  • 你问题中的代码是Xamarin.Forms,但是RecycleView属于原生android,你的项目类型是什么? Xamarin.Forms 还是 Xamarin.Android?
  • Xamarin Android 但我认为它的结构相同。所以如果不是,我不知道有什么问题。
  • 请发布您的 Xamarin.Android ListView 代码。

标签: android listview xamarin


【解决方案1】:

回收的工作原理如下:当您显示列表时,假设显示了 6 个项目,那么您将拥有一个至少包含 6 个单元实例的池。当您滚动时,消失的单元格实例会“返回”到“未使用”的实例池中。当列表视图必须显示新单元格时使用此池,以便现有实例再次用于其他行和其他内容。

请查看this answer 以获得更好的解释

您的问题似乎是当您单击单元格时单元格(视图实例)状态会发生变化,并且在重用该实例时不会重置。

您应该跟踪每个单元格内容的状态,并在获取任何单元格时分配它。 ViewHolder Pattern 是管理它的好方法

希望对你有帮助

【讨论】:

  • 当然可以!很酷的回答。现在我明白了 !谢谢!
【解决方案2】:
        List<string> contactList;
    ListView list;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);
        list = FindViewById<ListView>(Resource.Id.listView1);
        var uri = ContactsContract.CommonDataKinds.Phone.ContentUri;
        string[] projection = { ContactsContract.CommonDataKinds.Phone.Number, ContactsContract.Contacts.InterfaceConsts.DisplayName };
        var cursor = ContentResolver.Query(uri, projection, null, null, null);
        contactList = new List<string>();
        if (cursor.MoveToFirst())
        {
            while (cursor.MoveToNext())
                contactList.Add(cursor.GetString(cursor.GetColumnIndex(projection[0])) + cursor.GetString(cursor.GetColumnIndex(projection[1])));
        }
        var ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.ContactItemView, contactList);
        list.Adapter = ListAdapter;

        list.ItemClick += (sender, e) => { ListAdapter.Remove(contactList[e.Position]); Console.WriteLine(ListAdapter.GetItem(e.Position)); };}

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多