如何将数据放入使用AsyncTask接收的listview中?

时间:2014-07-30 06:34:27

标签: android listview android-asynctask

我成功检索但无法将数据放入listview。如何更新ui线程 检索数据后。

这里是检索数据的asynctask类

我尝试在onPostExecute中更新,但无法成功。

class GetJson extends AsyncTask<String, Integer,  ArrayList<RowItem>> {

  ArrayList<RowItem> rowItems = new ArrayList<RowItem>();
//ArrayList<ArrayList<String>> fullscreens =  new ArrayList<ArrayList<String>>() ;
  public AsyncResponse delegate = null;


private CustomListViewAdapter arrayadapter;
private ProgressDialog pDialog;
private Context Mycontext;
private ArrayList<String> alist;
private ListView listView;

public GetJson(Context cnxt,ArrayList<String> alist, CustomListViewAdapter adapt,ListView listView) {
    Mycontext = cnxt  ;
    //this.rowItems = rowItems;

    this.alist = alist;
    this.listView = listView;


}




@Override
protected void onPreExecute() {
// Showing progress dialog before sending http request
this.pDialog  = new ProgressDialog(Mycontext);
this.pDialog.setMessage("Please wait..");
this.pDialog.setIndeterminate(true);
this.pDialog.setCancelable(false);
this.pDialog.show();    

//alist.add("fifa");
} 


@Override
protected  ArrayList<RowItem> doInBackground(String... passing)  {          

here i am recieving data    

return rowItems;
}


@Override
protected void onPostExecute(ArrayList<RowItem> Items) {    
    super.onPostExecute(Items);


     this.pDialog.dismiss();





   }




  }

我在doinBackgroung方法中试过runuithread

我也遇到了运行时错误

这是我的代码

 protected Void doInBackground(Void... unused) {



    runOnUiThread(new Runnable() {
        public void run() {

            String result = null;
            InputStream is = null;
            JSONObject json_data=null;
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();


             JSONArray ja = new JSONArray();

             List<NameValuePair> params = new LinkedList<NameValuePair>();




                for(String s :  alist)
                {

                 Log.d("s",s);
                 params.add(new BasicNameValuePair("list[]",s));
                }

                try{

                 // 1. create HttpClient
                    HttpClient httpclient = new DefaultHttpClient();



                    String paramString = URLEncodedUtils.format(params, "utf-8");

                    // 2. make POST request to the given URL
                    HttpGet httpPost = new HttpGet("http://10.0.3.2/infogamma/getapps.php?"+paramString);

                // 4. convert JSONObject to JSON to String
                    String    json = ja.toString();



                   HttpResponse response = httpclient.execute(httpPost);
                   HttpEntity entity = response.getEntity();
                   //String json = EntityUtils.toString();
                   is = entity.getContent();
                 // Log.d("response", ");
                }
                catch(Exception e){
                 Log.i("taghttppost",""+e.toString());           
                  }


            //parse response
              try
                 {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));         
                    StringBuilder stringbuilder  = new StringBuilder();           
                    String line = null;            
                    while ((line = reader.readLine()) != null)
                    {
                    stringbuilder.append(line + "\n");
                    }

                    is.close();

                    result = stringbuilder.toString();
                    Log.d("ans",result);
                 }
               catch(Exception e)
                 {
                   Log.i("tagconvertstr",""+e.toString());
                 }        

          //get json data


              try{
                //JSONObject json = new JSONObject(result);

                    JSONArray jArray =  new JSONArray(result);             

                    Log.d("app_lentgh", Integer.toString(jArray.length()));
                    for(int i=0;i<jArray.length();i++)
                    { 
                     json_data = jArray.getJSONObject(i);
                       // this.donnees.add("title: "+ json_data.getString("title") + " appid: " + json_data.getString("appid") );     



                        try{
                    //commmand http
                           HttpClient httpclient = new DefaultHttpClient();


                           HttpGet httpget = new HttpGet("http://10.0.3.2/infogamma/getAppDetails.php?appid="+json_data.getString("appid"));

                           HttpResponse response = httpclient.execute(httpget);
                           HttpEntity entity = response.getEntity();
                           //String json = EntityUtils.toString();
                           is = entity.getContent();
                         // Log.d("response", ");
                        }
                        catch(Exception e){
                           Log.i("taghttppost",""+e.toString());           
                          }


                    //parse response
                      try
                         {
                            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));         
                            StringBuilder sb  = new StringBuilder();           
                            String line = null;            
                            while ((line = reader.readLine()) != null)
                            {
                            sb.append(line + "\n");
                            }

                            is.close();

                            result = sb.toString();
                            Log.d("ans",result);
                         }
                       catch(Exception e)
                         {
                           Log.i("tagconvertstr",""+e.toString());
                         }        

                      ArrayList<String> screenitem  =  new ArrayList<String>();

                      try{
                      JSONObject j = new JSONObject(result);



                      screenitem.add(j.getString("scr1"));
                       screenitem.add(j.getString("scr2"));
                       screenitem.add(j.getString("scr3"));

                      // this.fullscreens.add(screenitem);

                       //  RowItem(ImageView imageId, String title, String desc,String catgs,String downloads,String rating,String discription) 
                    RowItem item = new RowItem(j.getString("coverimage"), j.getString("title"), j.getString("category"),j.getString("downloads"),j.getString("rating"),
                            j.getString("scr1"),j.getString("scr2"),j.getString("scr3"),j.getString("discription"),j.getString("developer"),j.getString("price")
                            ,json_data.getString("appid")); 
                       rowItems.add(item);

                      }
                      catch(JSONException e){

                        Log.i("tagjsonexp",""+e.toString());
                      }
                     //SharedPreferences.Editor editor = ((Activity) Mycontext).getPreferences(Mycontext.MODE_PRIVATE).edit();
                     //editor.;
                     //editor.commit();

                       //Log.i("title",json_data.getString("title"));


                    }

                  }
               catch(JSONException e){

                Log.i("tagjsonexp",""+e.toString());
               } catch (ParseException e) {

                Log.i("tagjsonpars",""+e.toString());
              }



              adapt = new CustomListViewAdapter(getApplicationContext(),
                        R.layout.list_item, rowItems);
              listView.setAdapter(adapt);





                 }});




      return (null);

}

2 个答案:

答案 0 :(得分:0)

onPostExecute()中执行,或者如果您想立即从doInBackground()添加,请使用runOnUiThread()执行此操作。

修改

阅读完评论后,您正在使用CustomListViewAdapter,您的适配器类中是否有Context,int,ArrayList<String>作为参数的构造函数?

答案 1 :(得分:0)

您可以通过此代码

填充doInBackground的列表视图
runOnUiThread(new Runnable() {
        public void run() {
            //set listview Adapter here  
         }
});

这件事不可取。您还可以做的另一件事是创建一个类,该类可以保存您想要在列表项上显示的数据,并将该类对象的数组传递给onPostExecute方法,您可以从该方法处理UI线程。 / p>