Update Android Listview after Asynchronous update

雨燕双飞 提交于 2019-12-24 06:19:22

问题


I am converting my HTTP calls to asynchronous calls from synchronous ones. Because the connection is running in the background the data isn't there when I originally set my list adaptor. How can I get the list adaptor to update after my HTTP call? I've tried a few things like not setting the adaptor until data gets sent back and setting the adaptor again, but nothing has worked. Here's my current oncreate code

protected void onCreate(Bundle savedInstanceState) {
    overridePendingTransition(R.layout.anim_out,R.layout.anim_in);
    setTheme(R.style.Theme_D_theme);
    setContentView(R.layout.news_fragment);
    super.onCreate(savedInstanceState);

    text = (TextView) this.findViewById(R.id.nomore);
    list = (ListView) this.findViewById(R.id.newslist);
    list.setDividerHeight(2);

    new MyAsyncTask().execute("THIS");  



        list.setOnItemClickListener(this);
        list.setCacheColorHint(Color.WHITE);
        adapter = new SimpleAdapter(this, x, R.layout.drill1_listview,
                new String[] {"title","content","distance", "image"},
                new int[] {R.id.title, R.id.content, R.id.distance, R.id.image} );

}

And my AsyncTast

private class MyAsyncTask extends AsyncTask<String, Integer, Double>{

    @Override
    protected Double doInBackground(String... params) {
        // TODO Auto-generated method stub
        postData(params[0]);
        return null;
    }

    protected void onPostExecute(Double result){
        //pb.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
    }
    protected void onProgressUpdate(Integer... progress){
        //pb.setProgress(progress[0]);
    }

    public void postData(String valueIWantToSend) {


        ThreadPolicy tp = ThreadPolicy.LAX;
        StrictMode.setThreadPolicy(tp);

        HttpClient httpclient = new DefaultHttpClient();        
        String type = getIntent().getExtras().getString("type");
        HttpGet httppost = new HttpGet("http://myip.../all?latitude=42.12345&longitude=-76.2154");



        InputStream inputStream = null;
        try {               
            HttpResponse response = httpclient.execute(httppost);           
            HttpEntity entity = response.getEntity();
            String JSONstring = EntityUtils.toString(entity);
            Log.w("HTTPRESPONSE", JSONstring);

            //Toast.makeText(this, JSONstring, Toast.LENGTH_SHORT).show();

            if (!(JSONstring.equals(" 0"))) {




            JSONArray array = new JSONArray(JSONstring);
            for (int i = 0; i < array.length(); i++) {
                JSONObject row = array.getJSONObject(i);
                HashMap<String,String> temp = new HashMap<String,String>();




                String thisid = row.getString("id");
                ider.add(thisid);

                String starthold = row.getString("start_time");
                start.add(starthold);

                String endhold = row.getString("end_time");
                end.add(endhold);

                String latitudehold = row.getString("latitude");
                latitude.add(latitudehold);

                String longitudehold = row.getString("longitude");
                longitude.add(longitudehold);

                String addresshold = row.getString("street");
                address.add(addresshold);

                String title = row.getString("company");
                company.add(title);
                temp.put("title", title);

                String distance_hold = row.getString("distance");
                distance.add(distance_hold);
                temp.put("distance", distance_hold);


                int[] images = new int[] { R.drawable.local_eat,R.drawable.local_eat,
                         R.drawable.local_drink, R.drawable.local_shop,
                         R.drawable.local_do, R.drawable.local_chance,
                         R.drawable.local_all };

                String image = row.getString("promo_type");
                temp.put("image", Integer.toString(images[Integer.valueOf(image)]));

                String description = row.getString("name");
                name.add(description);
                temp.put("content", description);

                x.add(temp);

            }


            }
        } catch (Exception e) { 
            // Oops
        } finally {
            try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
        }           


    }

}

回答1:


in on post execution add this line. in the end.

x.add(temp);
adapter.notifyDataSetChanged();



回答2:


Do this way

private class MyAsyncTask extends AsyncTask<String, Integer, Double>{

    @Override
    protected Double doInBackground(String... params) {
        // TODO Auto-generated method stub
        postData(params[0]);
        return null;
    }

    protected void onPostExecute(Double result){
        //pb.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
    //UPDATE HERE
     adapter = new SimpleAdapter(this, x, R.layout.drill1_listview, 
                new String[] {"title","content","distance", "image"},
                new int[] {R.id.title, R.id.content, R.id.distance, R.id.image} );
     list.setAdapter(adapter);

    }
    protected void onProgressUpdate(Integer... progress){
        //pb.setProgress(progress[0]);
    }

    public void postData(String valueIWantToSend) {


        ThreadPolicy tp = ThreadPolicy.LAX;
        StrictMode.setThreadPolicy(tp);

        HttpClient httpclient = new DefaultHttpClient();        
        String type = getIntent().getExtras().getString("type");
        HttpGet httppost = new HttpGet("http://myip.../all?latitude=42.12345&longitude=-76.2154");



        InputStream inputStream = null;
        try {               
            HttpResponse response = httpclient.execute(httppost);           
            HttpEntity entity = response.getEntity();
            String JSONstring = EntityUtils.toString(entity);
            Log.w("HTTPRESPONSE", JSONstring);

            //Toast.makeText(this, JSONstring, Toast.LENGTH_SHORT).show();

            if (!(JSONstring.equals(" 0"))) {




            JSONArray array = new JSONArray(JSONstring);
            for (int i = 0; i < array.length(); i++) {
                JSONObject row = array.getJSONObject(i);
                HashMap<String,String> temp = new HashMap<String,String>();




                String thisid = row.getString("id");
                ider.add(thisid);

                String starthold = row.getString("start_time");
                start.add(starthold);

                String endhold = row.getString("end_time");
                end.add(endhold);

                String latitudehold = row.getString("latitude");
                latitude.add(latitudehold);

                String longitudehold = row.getString("longitude");
                longitude.add(longitudehold);

                String addresshold = row.getString("street");
                address.add(addresshold);

                String title = row.getString("company");
                company.add(title);
                temp.put("title", title);

                String distance_hold = row.getString("distance");
                distance.add(distance_hold);
                temp.put("distance", distance_hold);


                int[] images = new int[] { R.drawable.local_eat,R.drawable.local_eat,
                         R.drawable.local_drink, R.drawable.local_shop,
                         R.drawable.local_do, R.drawable.local_chance,
                         R.drawable.local_all };

                String image = row.getString("promo_type");
                temp.put("image", Integer.toString(images[Integer.valueOf(image)]));

                String description = row.getString("name");
                name.add(description);
                temp.put("content", description);

                x.add(temp);

            }


            }
        } catch (Exception e) { 
            // Oops
        } finally {
            try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
        }           


    }

}


来源:https://stackoverflow.com/questions/19042621/update-android-listview-after-asynchronous-update

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!