1

我正在尝试使用 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 并遇到了同样的问题。

4

3 回答 3

2

因为您每次都在创建一个新的适配器。您不仅要更改当前链接到列表的同一适配器中的数据........

由于您正在创建新适配器,并且在您调用 setAdpter 之前,新的 adter 不会与列表链接所以不值得调用 adapter.notifyDataSetChanged(); 对于未与列表链接的 adtper...

解决方案

无需每次都创建适配器。jsut 在 On-create 中创建并设置一次,仅更改 ArrayList(添加/删除而不是创建新的)并调用 adapter.notifyDataSetChanged();

于 2012-06-16T19:13:52.980 回答
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();



    }
于 2012-06-16T19:20:56.193 回答
1

当您在回调中创建新对象时Adapter,设置为列表适配器的对象不会受到影响。在新实例上调用so notifyDataSetChanged,而与 关联的实例List不知道方法调用。

将代码更改为以下内容:

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

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

    adapter.notifyDataSetChanged();
}
于 2012-06-16T19:16:34.663 回答