Как использовать InvalidateViews или NotifyDataSetChange?

#c# #android #listview #xamarin

#c# #Android #listview #xamarin

Вопрос:

Я относительно новичок в xamarin. Я использую пользовательский адаптер listview. Я долго думал об этой ошибке.. Я пытаюсь показать другой обновленный список в моем listview. щелчок по первому элементу (любому из 3 элементов) работает нормально.. но моя проблема заключается в том, что после нажатия на 2-й элемент (который может быть ShowAllLuzon или ShowAllMindanao). Похоже, он не обновляет / не обновляет мой listview, и мои элементы в моем listview исчезают. Я видел о InvalidateViews в java и попробовал InvalidateOptionMenu(); но, похоже, он не работает должным образом .. или я использую его неправильно? должен ли я добавить его в свой метод обновления customadapter?

мой код на панели действий

 else if (id == Resource.Id.ShowAllLuzon) //show LUZON
    {
        List<Mountain> filteredMountains = (from mountain in mMountains
                                            where mountain.Island == 1
                                            orderby mountain.MtName
                                            select mountain).ToList();
        mAdapter.Update(filteredMountains);
        RunOnUiThread(() => mAdapter.NotifyDataSetChanged());
    }
else if (id == Resource.Id.ShowAllVisayas) //show Visayas
    {
        List<Mountain> filteredMountains = (from mountain in mMountains
                                            where mountain.Island == 2
                                            orderby mountain.MtName
                                            select mountain).ToList();

        mAdapter.Update(filteredMountains);
        RunOnUiThread(() => mAdapter.NotifyDataSetChanged());
    }
else if (id == Resource.Id.ShowAllMindanao) //show Mindanao
    {
        List<Mountain> filteredMountains = (from mountain in mMountains 
                                            where mountain.Island == 3
                                            orderby mountain.MtName
                                            select mountain).ToList();

        mAdapter.Update(filteredMountains);
        InvalidateOptionsMenu(); //where I added InvalidateOptionsMenu
        RunOnUiThread(() => mAdapter.NotifyDataSetChanged());
    }
  

Я также попытался изменить свой метод обновления в моем пользовательском адаптере..

вот мой метод обновления в моем пользовательском адаптере..

  public  void Update(List<Mountain> mLists)
    {            
        mtList.Clear();
        mtList.AddRange(mLists);
        NotifyDataSetChanged();            
    }
  

работал над этим почти 3 часа.. пожалуйста, любые ответы были бы очень признательны..

Комментарии:

1. К какому классу Update(..) принадлежит? Вы пробовали вызывать notifyDataSetChanged() mAdapter ?

2. мой класс обновления принадлежит моему пользовательскому адаптеру.. Да, я пробовал .. но когда я нажимаю на второй элемент, кажется, что мой метод пытается найти его в моем текущем списке.. итак, как я могу обновить его перед вызовом метода?

3. Вы позвонили notifyDataSetChanged дважды. Один в Update() методе, а другой сразу после вызова Update() метода. Я предлагаю либо вызвать его один раз внутри Update() , либо снаружи if-then структуры.

4. пробовал удалить, не получилось: (