Я пытаюсь обновить свой 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 и столкнулся с той же проблемой.
потому что вы каждый раз создаете новый адаптер. вы не только меняете данные в одном и том же адаптере, который в настоящее время связан со списком........
Когда вы создаете новый адаптер, новый редактор не будет связан со списком до тех пор, пока вы не назовете setAdpter. Поэтому не стоит называть adapter.notifyDataSetChanged(); для adtper, который не связан со списком...
Решение
Нет необходимости создавать адаптер каждый раз. jsut создавать и устанавливать один раз в On-create и изменять ArrayList (добавлять/удалять не создавать новые) и вызывать адаптер.notifyDataSetChanged();
Когда вы создаете новый объект Adapter
в обратном вызове, тот, который настроен как адаптер списка, не влияет. Поэтому notifyDataSetChanged
вызывается в новом экземпляре, и тот, который связан со List
, не знает о вызове метода.
Измените код следующим образом:
private void checkProximity(double curLat, double curLon, Context cx) {
//update the original venueNamesArray, don't create a new instance
adapter.notifyDataSetChanged();
}
Вы обновляете адаптер в 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();
}