1

私はこのトピックを徹底的に調査し、StackOverflow で同様の質問を見つけましたが、私の質問には十分に具体的ではありません。ListView を SimpleCursorAdapter で更新しようとしています。「ネットワークの場所を取得」ボタンを押すと、メソッド「onLocationChanged」内で場所が変更されるたびに、ListView に新しい場所データ (id、lat、lon、acc、time) が動的に入力されます。これは、新しい位置データをデータベースに追加し、カーソルをアダプターに設定することによって行われます。

したがって、「戻る」ボタンが押されるか、電話の向きが変わるまでは問題なく動作します。onResume では listview が空になるので、データベースを開き直してカーソルをアダプタに、アダプタを listview に再度設定する必要がありました。これにより、「onResume」が呼び出された時点でデータベースからの完全なデータがリストビューに取り込まれます。

ただし、新しい位置データが「onLocationChanged」に追加されると、「onResume」が再度呼び出されるまで、新しいデータはリストビューに入力されません。adapter.notifyDataSetChanged は、「onResume」と「onLocation」の両方で呼び出されますが、役に立ちません。「onCreate」が呼び出された後、リストビューが別のものに変更されたと思いますが、それを解決する方法がわかりません。

この問題に関する知識をお持ちの方は、コードの何が問題なのか教えてください。

これが私のコードです:

public class MainActivity extends Activity {

LocationManager locMan;
String provider;
Boolean netWork_enabled = false;
private static long MINTIME;
private static float MINDIS;
Cursor cursor;
NetworkScanDB GeoLocInfoDb;
String row;
double lat;
double lon;
double accur;
double time;
EditText etMinTime;
EditText etMinDis;
ListView lv;
SimpleCursorAdapter sd;
String[] columns;
int[] to;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // initialize lv
    lv = (ListView) findViewById(R.id.listView1);

    // getting min time and distance from edit text
    etMinTime = (EditText) findViewById(R.id.et_minTime);
    etMinDis = (EditText) findViewById(R.id.et_minDis);

    // initiating location
    locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    provider = locMan.NETWORK_PROVIDER;

    try {
        netWork_enabled = locMan.isProviderEnabled(provider);
    } catch (Exception ex) {
    }

    columns = new String[] { NetworkScanDB.Key_RowID,
            NetworkScanDB.Key_Lat, NetworkScanDB.Key_Lon,
            NetworkScanDB.Key_Accur, NetworkScanDB.Key_Time };

    to = new int[] { R.id.t0, R.id.t1, R.id.t2, R.id.t3, R.id.t4 };

    sd = new SimpleCursorAdapter(MainActivity.this, R.layout.nsrow, cursor,
            columns, to, 0); // had to change to api 11., 0=no query

}

LocationListener locationListenerNetwork = new LocationListener() {

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

        try {

            GeoLocInfoDb = new NetworkScanDB(MainActivity.this); 
            GeoLocInfoDb.open();

            // insert row into DB
            GeoLocInfoDb.insertGeoLocInfo(location.getLatitude(),
                    location.getLongitude(), location.getAccuracy(),
                    location.getTime());

            cursor = GeoLocInfoDb.getGeoLocInfoCursor();

            sd = new SimpleCursorAdapter(MainActivity.this, R.layout.nsrow,
                    cursor, columns, to, 0); // had to change to api 11.,
                                                // 0=no query

            Toast.makeText(getApplicationContext(),
                    "added new location onLocationChanged",
                    Toast.LENGTH_LONG).show();

            // lv = (ListView) findViewById(R.id.listView1);

            sd.notifyDataSetChanged();

            lv.setAdapter(sd);

            GeoLocInfoDb.close();

        } catch (Exception e) {
            Log.w("nwscan", e.toString());
        }

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }
};

public void getNetworkLocation(View v) {

    MINTIME = Long.parseLong(etMinTime.getText().toString());
    MINDIS = Float.parseFloat(etMinDis.getText().toString());

    if (netWork_enabled) {

        locMan.requestLocationUpdates(provider, MINTIME, MINDIS,
                locationListenerNetwork);

    } else {
        Toast.makeText(getApplicationContext(), "network not enable",
                Toast.LENGTH_LONG).show();
    }

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    Toast.makeText(getApplicationContext(), "onResume ", Toast.LENGTH_LONG)
            .show();

    GeoLocInfoDb = new NetworkScanDB(MainActivity.this); 
    GeoLocInfoDb.open();
    cursor = GeoLocInfoDb.getGeoLocInfoCursor();

    sd = new SimpleCursorAdapter(MainActivity.this, R.layout.nsrow, cursor,
            columns, to, 0); // had to change to api 11., 0=no query

    sd.notifyDataSetChanged();

    lv.setAdapter(sd);

}

... }

4

0 に答える 0