List.IndexOf возвращает -1 после удаленного элемента в просмотре списка - PullRequest
0 голосов
/ 30 апреля 2018

хорошо, поэтому у меня есть список элементов, который просматривается в ListView. Я использую индекс выбранного элемента в списке.

"List.IndexOf (ListView.SelectedItem)". Из этого я сохраняю индекс как «идентификатор» в базе данных, которую я использую для получения информации позже и т. Д.

Проблема возникает, когда я удаляю один элемент из ListView. Процесс удаления работает нормально, но после того, как я удалил элемент, «List.IndexOf (ListView.SelectedItem)» возвращает -1 (до тех пор, пока я не перезапущу приложение), а не индекс того, где элемент помещен в просмотр списка. Почему это? есть ли способ обойти это? как обновить весь вид или что-то?

    <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 голосов
/ 30 апреля 2018

каждый раз, когда вы удаляете, вы затем делаете это, чтобы обновить ваши данные

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

это создает новый список из новых элементов , которые являются уникальными объектами, которые не совпадают с объектами, ранее сохраненными в списке.

Вместо использования IndexOf, который ищет конкретный экземпляр объекта, попробуйте запросить список по идентификатору или другому уникальному элементу, чтобы найти его место в списке. Или вместо обновления всего списка просто обновите существующий список, чтобы удалить удаленный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...