[英]notifydatasetchanged from within listener not working
我正在嘗試使用notifyDatasetChanged()從位置偵聽器的onLocationChanged函數更新我的Activity的ListView,但它不起作用。 然而,我可以在我的代碼中的同一點使用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並遇到了同樣的問題。
因為您每次都在創建一個新的適配器。 您不僅要更改當前鏈接到列表的同一個適配器中的數據........
在創建新適配器時,新的adter不會與list鏈接,直到你調用setAdpter所以不值得調用adapter.notifyDataSetChanged(); 對於未與列表鏈接的adtper ...
解
每次都不需要創建適配器。 jsut在On-create中創建並設置一次,只更改ArrayList(添加/刪除不創建新)並調用adapter.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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.