List.IndexOf在listview中删除项后返回-1

时间:2018-04-29 23:11:48

标签: c# android xamarin xamarin.forms

好的,所以我有一个在ListView中查看的项目列表。我正在使用listview中所选项目的索引。

“List.IndexOf(ListView.SelectedItem)”。从这里我将索引作为“id”存储到数据库中,我将用于稍后检索信息等。

当我从ListView中删除一个项目时出现问题。删除过程工作正常但在删除项目后,“List.IndexOf(ListView.SelectedItem)”返回-1(直到我重新启动应用程序)而不是项目在listview中的位置索引。为什么是这样?有没有办法解决?喜欢刷新整个视图还是什么?

    <mr:ListView x:Name="exampleListView" LongPressing="I_LongPressing">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ImageCell Text="{Binding mainSite}" TextColor="Black" Detail="{Binding link}" ImageSource="{Binding image}"></ImageCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</mr:ListView>
Items = new List<ListViewItem>();
int itemValue = Items.IndexOf(exampleListView.SelectedItem); //this will return -1 if i delete an item from ListView aka the List (Items)

删除评论中建议的列表中的项目代码!

public async void I_LongPressing(object sender, MR.Gestures.LongPressEventArgs e)
    {
        var result = await DisplayAlert("Delete", "Are you sure you want to delete this object?", "Delete", "Cancel");
        if (result == true)
        {
            ListViewItem k = (ListViewItem)exampleListView.SelectedItem;
            dataBase.Query<ListViewItem>(string.Format("DELETE FROM [ListViewItem] WHERE [link] = '{0}'", k.link));

            int itemValue = Items.IndexOf(exampleListView.SelectedItem);
            dataBase.Query<ObjectAndNote>(string.Format("DELETE FROM [ObjectAndNote] WHERE item = '{0}'", itemValue));
            Update();
        }
    }

    public async void Update()
    {
        string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        var asyncCon = new SQLiteAsyncConnection(path + "/TestDB.dc3");

        exampleListView.ItemsSource = new List<ListViewItem>();
        List<ListViewItem> refreshedList = await asyncCon.QueryAsync<ListViewItem>("SELECT * FROM ListViewItem");
        await asyncCon.QueryAsync<ObjectAndNote>(string.Format("UPDATE ObjectAndNote SET item = 'item--'"));
        if (refreshedList.Count != 0)
        {
            exampleListView.ItemsSource = refreshedList;
        }
    }

亲切的问候

1 个答案:

答案 0 :(得分:2)

每次删除时,都会执行此操作来刷新数据

List<ListViewItem> refreshedList = await asyncCon.QueryAsync<ListViewItem>("SELECT * FROM ListViewItem");

这会创建新商品新商品,这些新商品与之前存储在列表中的对象相同的唯一商品。

不是使用查找对象的特定实例的IndexOf,而是尝试通过ID或其他一些独特元素查询列表,以找到它在列表中的位置。或者,不要刷新整个列表,只需更新现有列表即可删除已删除的项目。