1

notifyDatasetChanged()を使用してロケーションリスナーのonLocationChanged関数内からアクティビティの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


    }

}

setListAdapterの代わりにnotifyDatasetChanged()を使用する理由は、リストビューを設定するとリストビューが一番上にスクロールバックするためです。notifyDatasetChanged()を使用してもエラーはスローされないため、これが機能しない理由を理解するのは困難です。

ListActivityを拡張する代わりに、通常のListViewを使用しようとしましたが、同じ問題が発生しました。

4

3 に答える 3

2

毎回新しいアダプタを作成しているからです。現在リストにリンクされている同じアダプタのデータを変更するだけではありません.......。

新しいアダプタを作成しているため、setAdpterを呼び出すまで、新しいadterはリストにリンクされません。したがって、adapter.notifyDataSetChanged();を呼び出す価値はありません。リストにリンクされていないadtperの場合...

解決

毎回アダプタを作成する必要はありません。jsutは、On-createで一度作成および設定し、ArrayListのみを変更し(追加/削除ではなく、新規作成)、adapter.notifyDataSetChanged();を呼び出します。

于 2012-06-16T19:13:52.980 に答える
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();
}
于 2012-06-16T19:16:34.663 に答える
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 に答える