簡體   English   中英

notifydataset在偵聽器內部無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM