0

エラーを見つけるために日を検索します。私には成功がありません。ListView を使用したアクティビティがあります。ListView は json データで 5 分ごとに更新されます。json データを取得するには、緯度と経度をサーバーに POST します (SQL でフィルター処理します)。毎回 ListView をクリアします。mylist.clear();わかった。それはうまくいきます。

LocationManager は常に Location を更新します (Toast で確認します)。json データの郡をフィルター処理します。

JSONObject json = null;
           json = jsonFunctions.getJSONfromURL("http://myurl.de", mlat, mlon);

しかし、郡を離れて新しい郡にいる場合、ListView は新しいデータで更新されません。古い郡の古いデータを更新するたびに表示されます。

しかし、私は別の活動をしています

        Intent intent = new Intent(StartActivity.this, ReportActivity.class);
        startActivity(intent);
        finish();

アプリを起動してListViewでアクティビティに戻ると、正しいjsonデータを含む新しい郡が利用可能です...

私は自分の間違いを見つけませんでした。助けてください。

コード:

public class StartActivity extends ListActivity {
    private Timer autoUpdate;
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
    Button btnShowLocation;

    // GPSTracker class
    GpsData gps;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listplaceholder);

        btnShowLocation = (Button) findViewById(R.id.report_btn);
        btnShowLocation.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(StartActivity.this, ReportActivity.class);
                startActivity(intent);
                finish();
            }
        });

        //new task().execute();
    }

     @Override
     public void onResume() {
      super.onResume();
      autoUpdate = new Timer();
      autoUpdate.schedule(new TimerTask() {
       @Override
       public void run() {
        runOnUiThread(new Runnable() {
         public void run() {
             //start GPS
             gps = new GpsData(StartActivity.this);
             Toast.makeText(StartActivity.this, "lat: " + gps.getLatitude() + "lon: " + gps.getLongitude(), Toast.LENGTH_SHORT).show();
             //start json download
             new task().execute();
         }
        });
       }
      }, 0, 300000); // updates each 5 min
     }

class task extends AsyncTask<String, String, Void>
{
private ProgressDialog progressDialog = new ProgressDialog(StartActivity.this);
    InputStream is = null ;
    String result = "";
    protected void onPreExecute() {
       progressDialog.setMessage("Status Update...");
       progressDialog.show();
       progressDialog.setOnCancelListener(new OnCancelListener() {
    @Override
        public void onCancel(DialogInterface arg0) {
        task.this.cancel(true);
       }
    });
     }
       @Override
    protected Void doInBackground(String... params) {
            //get Location Data
               double latitude = gps.getLatitude();
               double longitude = gps.getLongitude();
               String mlat = String.valueOf(latitude);
               String mlon = String.valueOf(longitude);

               //if (gps.latitude != 0.0) {

           JSONObject json = null;
           json = jsonFunctions.getJSONfromURL("http://myurl.de", mlat, mlon);

        if (json != null){

      try{
        JSONArray  earthquakes = json.getJSONArray("bing");
        mylist.clear();
        String myCity = "";
            for(int i=0;i<earthquakes.length();i++){                        
                HashMap<String, String> map = new HashMap<String, String>();    
                JSONObject e = earthquakes.getJSONObject(i);

                //get the wright name for artID
                String myArt = getString(getResources().getIdentifier("list_" + e.getString("artID"), "string", getPackageName()));

                if (!(e.getString("county") == e.getString("city"))){
                    myCity = e.getString("city");
                }

                if (e.getString("city").equals("")){
                    myCity = e.getString("county");
                }

                // Get Time difference
                String clienttime = e.getString("clienttime");
                long mTime = (System.currentTimeMillis() - Long.valueOf(clienttime).longValue()) / (60 * 1000);

                map.put("id",  String.valueOf(i));
                map.put("mlat", e.getString("lat"));
                map.put("mlon", e.getString("lon"));
                map.put("first", myArt + ": " + e.getString("road") + ", " + myCity);
                map.put("second", mTime + " min. ago, " + e.getString("suburb"));
                mylist.add(map);
            }       
      }

      catch(JSONException e){
         Log.e("log_tag", "Error parsing data "+e.toString());
      }
      }
        else{
          mylist.clear();
          HashMap<String, String> map = new HashMap<String, String>();
            map.put("id",  "1");
            map.put("mlat", "51.6764996");
            map.put("mlon", "7.7664251");
            map.put("first", getString(R.string.no_data1));
            map.put("second", getString(R.string.no_data));
            mylist.add(map);
      }
      //}

            return null;

        }
    protected void onPostExecute(Void v) {
        ListAdapter adapter = new SimpleAdapter(StartActivity.this, mylist , R.layout.main, 
                new String[] { "first", "second" }, 
                new int[] { R.id.item_title, R.id.item_subtitle });

setListAdapter(adapter);

final ListView lv = getListView();
lv.setTextFilterEnabled(true);  
lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              
        @SuppressWarnings("unchecked")
        HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);                   
        Toast.makeText(StartActivity.this, "Map View is coming soon", Toast.LENGTH_SHORT).show(); 
        //Intent intent = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("geo:" + o.get("mlat") + "," + o.get("mlon") + "?z=20"));
        //startActivity(intent);
    }
});
            this.progressDialog.dismiss();

        } 
    }

@Override
public void onPause() {
 super.onPause();
 autoUpdate.cancel();
 gps.stopUsingGPS();
}

}
4

1 に答える 1

1

postExecute で毎回アダプターを作成しないでください。単に adepter.clear を使用してから、 notifyDataSetChanged を呼び出した後に新しいデータを追加してください。

于 2013-01-29T10:04:25.143 に答える