0

まず、テキストを取り出してListViewに追加します(この部分は機能しています)。 次に、ListViewの各アイテムについて、イメージを取得していて、レイアウトで既に定義されている各アイテムのImageViewにこのイメージを追加する必要があります。 すべての画像を取得できますが、ListViewを同じもので更新する方法がわかりません。AndroidでListViewの各ImageViewの画像を新しい画像で更新する方法

//AsyncTask For texts. 
private class pgData extends AsyncTask<String, String, JSONArray> { 
    protected JSONArray doInBackground(String... params) { 
     publishProgress("Starting"); 
     String result=null; 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://xxx.xxx/xxx.php"); 
     HttpResponse response = null; 
     HttpEntity httpentity =null; 
     JSONArray t=null; 
     try{ 
      response= httpclient.execute(httppost); 
      httpentity=response.getEntity(); 
      result= EntityUtils.toString(httpentity); 
      t=new JSONArray(result); 
     }catch (Exception e){ 
      publishProgress(e.toString()); 
      this.cancel(true); 
     } 
     return t; 
    } 
    protected void onProgressUpdate(String... i) { 
     Toast.makeText(getBaseContext(), i[0], Toast.LENGTH_SHORT).show(); 
    } 

    protected void onPostExecute(JSONArray result) { 
      String x[]; 
      l = result.length(); 
      pg_data = new pg[l]; 
      JSONObject jsonObject; 
      for (int i = 0; i < l; i++) { 
       try { 
        jsonObject = result.getJSONObject(i); 
        x[0] = jsonObject.getString("xxx"); 
        x[1]=jsonObject.getString("xxx"); 
        x[2] = jsonObject.getString("xxxx"); 
        x[3] = jsonObject.getString("rentMonthly"); 
        pg_data[i] = new pg(
          x[0], 
          x[1], 
          x[2], 
          x[3] 
        ); 
        jdata.add(xxx_data[i]); 
       } catch (Exception e) { 
        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show(); 
       } 
      } 
      adapter = new pgAdapter(second.this, 
        R.layout.pg, 
        xxx_data); 
      lv = (ListView) findViewById(R.id.listView); 
      lv.setAdapter(adapter); 
      new xxImage().execute(); //exexuting async task for fetching images. 
    } 
} 

//Async Task for fetching images 
private class xxImage extends AsyncTask<String, String, JSONArray> { 
    protected JSONArray doInBackground(String... params) { 
     publishProgress("Getting Images"); 
     String result=null; 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://xxx.xx/xx.php"); 
     HttpResponse response = null; 
     HttpEntity httpentity =null; 
     JSONArray t=null; 
     try{ 
      response= httpclient.execute(httppost); 
      httpentity=response.getEntity(); 
      result= EntityUtils.toString(httpentity); 
      t=new JSONArray(result); 
     }catch (Exception e){ 
      publishProgress(e.toString()); 
      this.cancel(true); 
     } 
     return t; 
    } 
    protected void onProgressUpdate(String... i) { 
     Toast.makeText(getBaseContext(), i[0], Toast.LENGTH_SHORT).show(); 
    } 
    protected void onPostExecute(JSONArray result) { 
      String image1; 
      l = result.length(); 
      xx_image = new xxImage[l]; 
      JSONObject jsonObject; 
      for (int i = 0; i < l; i++) { 
       try { 
        jsonObject = result.getJSONObject(i); 
        image1 = "\n" + jsonObject.getString("image1") + "\n"; 
        xx_image[i] = new xxImage(
          image1 
        ); 
        jimage.add(xx_image[i]); 
       } catch (Exception e) { 
        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show(); 
       } 
      } 
      //I got all the Images in 'jimage'. Now how to update the ListView from here? 
     } 
    } 
+0

本当に 'AsyncTask'は' Runnable'で 'Callback Pattern'を使いません。' UI Thread'を更新したいので 'Holder'クラスを使って画像を' UI'に追加してください。 – Hosseini

+1

あなたは間違いなくピカソなどの画像ローディングライブラリ。これは、画像を失うための作業を単純化し、コードには見えない目に見えないエラーを処理します。アダプターに画像を表示するには、どのビューを使用して表示しているかによって異なりますが、このチュートリアルのアドバイスを参考にしてください。http://developer.android.com/training/material/lists-cards.html – chRyNaN

+0

Iどこにでもそれを読んで、新しいデータをアダプタに追加して通知する必要がありますが、実装することはできません。私を助けてくれますか? –

答えて

0

は、ループ内で次の手順を実行します

  1. はImage1の中でそれを取得した後、あなたの画像を解析します。
  2. アダプターからiを取得します。
  3. そのアイテムのIDを持つビューを見つけます。
  4. に画像を設定します。

完了。試してみてください。

0

これを行うにはカスタムArrayAdapterを実装する必要があります。あなたのケースでは

ArrayAdapter(Context context, int resource, T[] objects) 

をあなたが持っているテキストデータを使用してアダプタを設定しますが、使用しているアダプタの形式はあなたの最初のasyncTaskでTは(私の知る限り)文字列です。しかし、このTをイメージを含むカスタムオブジェクトにしたいとします。独自のカスタムアダプターを構築することで、これを行うことができます。 this答えを見てください。

また、別の方法として、Tオブジェクトがこのようなものである必要があります。

CustomObject customObject = new CustomObject(text, image). 

テキスト配列だけを渡すのではなく、アダプタに渡すこれらのオブジェクトのリストを作成してみてください。しかし、このためには、すべての画像がロードされるまで待たなければなりません。

Picassoを使用することをお勧めします。カスタムアダプタを実装します。あなたの現在のアプローチは非常に欠陥があります。 2番目のAsyncTaskで

+0

私の画像はデータベースではないので、私はPicassoを使うことができません。私は本当にこれを行うことができないので、2番目の非同期タスクの左部分を書くことができます。 –

関連する問題