2012-08-22 90 views
0

我值所有元素都通過最後一個元素中的HashMap的ArrayList更換

問Q-ID
Q1 1
Q2 2
...等等

我想通過調用函數來檢索它們。所以我用包含HashMap如下的ArrayList ..

public ArrayList<HashMap<String,String>> getAllQuestions(Integer id) 
{ 
    try 
    { 
     HashMap<String,String> QuesList = new HashMap<String,String>(); 
     ArrayList<HashMap<String, String>> QuestionArrayList = new ArrayList<HashMap<String, String>>(); 
     // Select All Query 
     String selectQuery = <some query here>; 

      cursor = mDb.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) 
     { 
      do 
      { 

       QuesList.put("ques_id", cursor.getString(2)); 
       QuesList.put("ques_text", cursor.getString(8)); 
       QuestionArrayList.add(QuesList); 
       Log.i("ques",cursor.getString(8)); 
      } while (cursor.moveToNext()); 
     } 


     Log.i("check"," Ques list returned"); 
     return QuestionArrayList; 

    } 
    catch (SQLException mSQLException) 
    { 
     Log.e(TAG, "getTestData >>"+ mSQLException.toString()); 
     throw mSQLException; 
    } 
} 

現在的logcat顯示,所有問題都在的時候成功地檢索單獨的抓取(如圖中的Log.i聲明),但磨片我運行下面的最後循環所有的元素都被最後提取的問題所取代。任何幫助深表感謝。

for(HashMap<String, String> t : QuesList) 
    { 
     Log.d("out there", "count" + t.getString()); 
     Log.i("mapping....",t.get("ques_id")); 
    } 

回答

5

當您調用add方法時,僅添加對該對象的引用。因此,下次修改對象時,引用引用修改後的對象,並且不保留對象的舊狀態。

在你的情況,你必須創建新的對象,你想將它們添加到List每次:

 // looping through all rows and adding to list 
    if (cursor.moveToFirst()) 
    { 
     do 
     { 
      //Create a new object instance of the Map 
      HashMap<String,String> QuesList = new HashMap<String,String>(); 

      QuesList.put("ques_id", cursor.getString(2)); 
      QuesList.put("ques_text", cursor.getString(8)); 
      QuestionArrayList.add(QuesList); 
      Log.i("ques",cursor.getString(8)); 
     } while (cursor.moveToNext()); 
    } 
+0

雖然這是問題,但還有一個更基本的問題:首先不應該有一個列表。 – assylias

+1

@assylias:我不會那麼肯定。這個問題沒有說明如何使用結果數據結構。也許消費API需要這種佈局。 –

+0

@JanHudec這是一種可能性,但我認爲這是值得一提的情況下,它不是原因。 – assylias

0

這樣做的原因是,你的循環裏面,您只使用單在QuestionArrayList中添加的Questlist實例。

嘗試移動

HashMap<String,String> QuesList = new HashMap<String,String>(); 

內循環。

do 
     { 

      HashMap<String,String> QuesList = new HashMap<String,String>(); 

      QuesList.put("ques_id", cursor.getString(2)); 
      QuesList.put("ques_text", cursor.getString(8)); 
      QuestionArrayList.add(QuesList); 
      Log.i("ques",cursor.getString(8)); 
     } while (cursor.moveToNext()); 
0

你不需要在這裏的列表,使用地圖來存儲所有鍵/值對:

QuesList.put(cursor.getString(2), cursor.getString(8)); 

將存儲的問題在地圖上。你可以循環:

for(String q : QuesList.values()) {…} 

ps:你的問題是,你只使用一個地圖,並保持使用相同的鍵,覆蓋以前的條目。

+0

問題中的結構的確看起來不是最理想的,但它可能是消費API需要的,或者列表中的每個地圖中可能會有更多的條目,或者條目的順序可能很重要或者其他的東西,所以您的建議可能會或可能無效。 –

相關問題