0

私は次のような価値観を持っています

質問 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"));
     }
4

3 に答える 3

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());
     }
于 2012-08-22T06:51:09.270 に答える
0

これは、ループ内で、QuestionArrayListに追加されたQuestlistのインスタンスを1つだけ使用しているためです。

移動してみてください

 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());
于 2012-08-22T06:54:19.373 に答える
0

ここにリストは必要ありません。マップを使用して、すべてのキーと値のペアを保存します。

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

質問を地図に保存します。次に、ループできます。

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

追伸:問題は、1つのマップのみを使用し、同じキーを使用し続け、以前のエントリを上書きすることです。

于 2012-08-22T06:54:43.857 に答える