2017-03-08 2 views
0

私はJSONからデータをフェッチし、Asynctask(doinbackground)でのArrayListに格納していますを返す - ArrayListに追加した後にログを維持し、これは正しく、すべての項目が表示されます。 onPostExecuteでArrayListの<HashMap>は常に最後の値

、私は様々な位置にいくつかのArrayListを印刷しています - しかし、それは常に最後のエントリを表示します。完全AsyncTask

 public class GetTheCarList extends AsyncTask<Void,Void,Void> 
{ 
    ProgressDialog progressDialog; 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog=ProgressDialog.show(getActivity(),"","Loading.."); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     StringBuilder sb=new StringBuilder(); 
     BufferedReader br=null; 

     try { 
      br=new BufferedReader(new InputStreamReader(getActivity().getAssets().open("vehicles.json"))); 
      String temp; 
      while((temp=br.readLine())!=null) 
      { 
       sb.append(temp); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     finally { 
      try { 
       br.close(); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 


     JSONArray jsonAr = null; 
     try { 
      jsonAr = new JSONArray(sb.toString()); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     mapping=new HashMap<>(); 
     carList=new ArrayList<>(); 
     for(int i=0;i<=jsonAr.length();i++) 
     { 
      JSONObject jsonOb= null; 
      try { 
       jsonOb = jsonAr.getJSONObject(i); 
       String year=jsonOb.getString("year"); 
       String make=jsonOb.getString("make"); 
       String model=jsonOb.getString("model"); 
       String mileage=jsonOb.getString("mileage"); 
       String icon=jsonOb.getString("image_url"); 


       mapping.put("year",year); 
       mapping.put("make",make); 
       mapping.put("model",model); 
       mapping.put("mileage",mileage); 
       mapping.put("image_url",icon); 

       carList.add(mapping); 
       Log.e("***", "carlist " + " " + carList.get(i)); // WORKS CORRECTLY 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 


     } 


     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     efficientAdapter=new EfficientAdapter(); 
      Log.e("***", "carlist " + " " + carList.get(17620)); // DISPLAYS LAST VALUE 

     lvCarList.setAdapter(efficientAdapter); 
     progressDialog.dismiss(); 
    } 
} 
+0

上記のリンクには2つのソリューションがあります:1)リストオブジェクトの静的フィールド2)誤って同じオブジェクトをリストに追加しています。私は静的な配列のリストを言及しなかったと私は入力としてログ、それは期待どおりに印刷されている –

+0

それは第2のものです。同じオブジェクトをリストに繰り返し追加していますが、ログするたびに最新の値に更新されています。 –

答えて

0

ためのコードスニペットの下

あなたがだけにして、1つのHashMapを作成し、あなたのcarListに(jsonAr.length())何回もこれを追加しました。同じオブジェクトに複数回「参照」を追加しました。新しいオブジェクトを作成する必要がある場合は、別のオブジェクトを作成する必要があります。オブジェクト内のデータが変更されると、それらの参照はすべて「更新」されます。

非常に明確にし、各ループは、単に何が起こるか見て、その後、mappingの値を変更し、あなたのための()ループ内carList

移動

mapping=new HashMap<>(); 

にそれを別の参照を追加しています。

+0

私がやっている完全な非同期タスクを追加しました - –

+0

本当に何かが起こっていない限り、私の答えはまだまだです。あなたは参照によってオブジェクトを渡しており、それが価値のあるものになることを期待しています。 – mstorkson

+0

ループ内でのマッピングの移動が機能しています。ありがとうございました –

関連する問題