notifydatasetchange изнутри слушатель не работает

1

Я пытаюсь обновить свой Activity ListView из функции onLocationChanged для приемника местоположения, используя notifyDatasetChanged(), но он не работает. Однако я могу использовать setListAdapter с той же точки в моем коде, и это сработает.

Вот мой код:

public class TestListeners extends ListActivity {

    ArrayAdapter adapter;

    private final LocationListener networkLocationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
            case LocationProvider.AVAILABLE:
                break;
            case LocationProvider.OUT_OF_SERVICE:
                break;
            case LocationProvider.TEMPORARILY_UNAVAILABLE:
                break;
            }
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onLocationChanged(Location location) {
            checkProximity(location.getLatitude(), location.getLongitude(), cx);
        }
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //get a list here venueNamesArray        
        //etc

         adapter = new ArrayAdapter<String>(this,
         android.R.layout.simple_list_item_1, android.R.id.text1,
         venueNamesArray); 

         setListAdapter(adapter);
    }


    private void checkProximity(double curLat, double curLon, Context cx) {

        //get a different list here venueNamesArray
        //etc

        adapter = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1, android.R.id.text1,
                venueNamesArray);

        adapter.notifyDataSetChanged();//this doesnt work and no error is thrown
            setListAdapter(adapter);//this works


    }

}

Причина, по которой я хочу использовать notifyDatasetChanged() вместо setListAdapter, - это то, что listview прокручивается вверх, когда вы устанавливаете его. Никакая ошибка не бросается, когда я использую notifyDatasetChanged(), поэтому мне сложно понять, почему это не работает.

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

Теги:

3 ответа

2
Лучший ответ

потому что вы каждый раз создаете новый адаптер. вы не только меняете данные в одном и том же адаптере, который в настоящее время связан со списком........

Когда вы создаете новый адаптер, новый редактор не будет связан со списком до тех пор, пока вы не назовете setAdpter. Поэтому не стоит называть adapter.notifyDataSetChanged(); для adtper, который не связан со списком...

Решение

Нет необходимости создавать адаптер каждый раз. jsut создавать и устанавливать один раз в On-create и изменять ArrayList (добавлять/удалять не создавать новые) и вызывать адаптер.notifyDataSetChanged();

  • 0
    На самом деле моя проблема заключалась в том, что я использовал неверный тип массива для заполнения моего ArrayList, как видно из этого потока stackoverflow.com/questions/3200551/… Я случайно скопировал новый инициализатор ArrayAdapter
  • 0
    да, случись с каждым ....... :)
Показать ещё 1 комментарий
1

Когда вы создаете новый объект Adapter в обратном вызове, тот, который настроен как адаптер списка, не влияет. Поэтому notifyDataSetChanged вызывается в новом экземпляре, и тот, который связан со List, не знает о вызове метода.

Измените код следующим образом:

private void checkProximity(double curLat, double curLon, Context cx) {

    //update the original venueNamesArray, don't create a new instance

    adapter.notifyDataSetChanged();
}
  • 0
    На самом деле моя проблема заключалась в том, что я использовал неверный тип массива для заполнения моего ArrayList, как видно из этого потока stackoverflow.com/questions/3200551/… Я случайно скопировал новый инициализатор ArrayAdapter
1

Вы обновляете адаптер в checkProximity, поэтому почему notifyDataSetChanged не работает.

Измените свой код следующим образом.

private void checkProximity(double curLat, double curLon, Context cx) {

        //get values that are to be added into venueNamesArray.

        venueNamesArray.add(value1); //This is just sample you will put your values
        venueNamesArray.add(value2);


        adapter.notifyDataSetChanged();



    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню