2012-08-22 59 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需要的,或者列表中的每个地图中可能会有更多的条目,或者条目的顺序可能很重要或者其他的东西,所以您的建议可能会或可能无效。 –

相关问题