所有元素都被hashmap的arraylist中的last元素替换

时间:2012-08-22 06:40:52

标签: android arraylist hashmap

我的值为

问题Q-id
Q1 1 Q2 2
......等等

我想通过调用函数来检索它们。所以我使用了HashMaps的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"));
     }

3 个答案:

答案 0 :(得分: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());
     }

答案 1 :(得分: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());

答案 2 :(得分:0)

此处不需要列表,使用地图存储所有键/值对:

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

将您的问题存储在地图中。然后你可以循环:

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

Ps:你的问题是你只使用一张地图并继续使用相同的密钥,覆盖以前的条目。