2012-06-16 70 views
1

我想从使用notifyDatasetChanged()的位置侦听器的onLocationChanged函数更新我的Activity的ListView,但它不起作用。我可以使用setListAdapter从我的代码中的相同点,这将工作。notifydatasetchanged从内部侦听器不工作

这里是我的代码:

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并遇到同样的问题。

回答

2

因为您每次都创建一个新的适配器。你不只是改变当前链接到列表的同一个适配器中的数据......

当你创建新的适配器和新的adter不会链接到列表,直到你调用setAdpter所以它是不值得调用adapter.notifyDataSetChanged();对于adtper不与列表链接...

解决方案

没有必要每次都创建适配器。 jsut在On-create中创建并设置一次,只更改ArrayList(添加/删除不创建新)并调用adapter.notifyDataSetChanged();

+0

其实我的问题是我用错了类型的数组来填充我的ArrayList在这个线程看到http://stackoverflow.com/questions/3200551/unable-to-modify-arrayadapter-in-listview我已经错误地复制了新的ArrayAdapter初始值设定器 – brux

+0

yup,发生在每一个....... :) –

+0

感谢兄弟...它真的对我有帮助... –

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在这个线程看到http://stackoverflow.com/questions/3200551/unable-to-modify-arrayadapter-in-listview我已经无意中复制了新的ArrayAdapter初始值设定项 – brux

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(); 



    }