Android HashMap показывает только последний элемент - PullRequest
0 голосов
/ 13 октября 2011

Итак, я получаю данные из базы данных и помещаю их в HashMap и пытаюсь отобразить их в виде списка. Но проблема в том, что он показывает только последний элемент в виде текста всех текстовых просмотров, и я действительно не могу найти, где моя ошибка. Так что, если кто-нибудь сможет мне помочь, я буду очень счастлив. Вот код, который я использую:

public class Recommended extends TabGroupActivity {
    private final String IMAGE = "";
    private final String TITLE = "";
    private final String CARDS_COUNT = "";
    private ArrayList <HashMap<String, Object>> items;
    Bitmap b;
    String cardsCount;
    String text;
    int collId;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recommended_layout);
        ListView lv1 = (ListView)findViewById(R.id.listViewRecommended);
        UserDatabaseHelper userDbHelper = new UserDatabaseHelper(this, null, 1);
        userDbHelper.initialize(this);
        items = new ArrayList<HashMap<String, Object>>();
        HashMap<String, Object> hm;


        String sql = "SELECT objectId, title, cardsCount FROM collections WHERE isRecommended = 1";
        Cursor cursor = userDbHelper.executeSQLQuery(sql);
        if(cursor.getCount()==0){
            Log.i("Cursor Null","CURSOR IS NULL");
        } else if(cursor.getCount()>0){
            for(cursor.move(0); cursor.moveToNext(); cursor.isAfterLast()) {
                    text = cursor.getString(cursor.getColumnIndex("title"));
                    Log.i("Show Title","Show Title : "+text);
                    cardsCount = cursor.getString(cursor.getColumnIndex("cardsCount"));
                    collId = Integer.parseInt(cursor.getString(cursor.getColumnIndex("objectId")));
                    Log.i("CollId","Collection ID : "+collId);                          
                    b = BitmapFactory.decodeFile("/sdcard/7073d92dce10884554d7e047f1c51cb6.jpg", null); 

                    hm = new HashMap<String, Object>();
                    hm.put(IMAGE, b);
                    hm.put(TITLE, text);
                    hm.put(CARDS_COUNT, cardsCount +" Stampii");
                    items.add(hm);              

            }

            Log.i("items", "items: " + items);  

            final SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.main_listview,
                    new String[]{TITLE, CARDS_COUNT, IMAGE}, new int[]{ R.id.main_name, R.id.main_info, R.id.main_img});
            lv1.setAdapter(adapter);
            lv1.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> a, View v, int position, long id) 
                {
                    Intent previewMessage = new Intent(Recommended.this, MyCollectionId.class);
                    TabGroupActivity parentActivity = (TabGroupActivity)getParent();
                    previewMessage.putExtra("collection_id", collId);
                    parentActivity.startChildActivity("MyCollectionId", previewMessage);
                }
            });
}

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Проблема в том, что вы инициализировали свою хэш-карту внутри цикла for, поэтому она будет переинициализироваться при каждой итерации цикла.использовать этот способ для получения значений из БД при использовании курсора

Попробуйте этот код для добавления значений из БД в карту хеша:

hm = new HashMap<String, Object>(); 
if (cursor.moveToFirst()) {
do {
    text = cursor.getString(cursor.getColumnIndex("title"));
    Log.i("Show Title","Show Title : "+text);
    cardsCount = cursor.getString(cursor.getColumnIndex("cardsCount"));
    collId = Integer.parseInt(cursor.getString(cursor.getColumnIndex("objectId")));
    Log.i("CollId","Collection ID : "+collId);                          
    b = BitmapFactory.decodeFile("/sdcard/7073d92dce10884554d7e047f1c51cb6.jpg", null); 
    hm.put(IMAGE, b);
    hm.put(TITLE, text);
    hm.put(CARDS_COUNT, cardsCount +" Stampii");
    items.add(hm);   
} while (cursor.moveToNext());
}
1 голос
/ 14 октября 2011

Вы должны объявить hm внутри цикла for. Когда вы делаете это так:

@Override
    public void onCreate(Bundle savedInstanceState){
       ....
       HashMap<String, Object> hm;
       ....
       for(cursor.move(0); cursor.moveToNext(); cursor.isAfterLast()) {
          //do something with hm
          items.add(hm);
       }
       ...

Он добавляет ссылку на hashmap к элементам, но вы меняете эту ссылку на каждой итерации. По сути, вы добавляете одну и ту же ссылку снова и снова. Вы должны сделать это так:

@Override
    public void onCreate(Bundle savedInstanceState){
       ....
       for(cursor.move(0); cursor.moveToNext(); cursor.isAfterLast()) {
          HashMap<String, Object> hm;
          //do something with hm
          items.add(hm);
        }
       ...
1 голос
/ 13 октября 2011
             hm = new HashMap<String, Object>();
                hm.put(IMAGE, b);
                hm.put(TITLE, text);
                hm.put(CARDS_COUNT, cardsCount +" Stampii");
                items.add(hm);              

присвойте тем операторам, которые вы создаете, разные хэш-таблицы для каждой строки результатов запроса. это действительно то, что вы хотите? Во-вторых ... с помощью hashmap, каждый раз, когда вы используете один и тот же ключ, старое значение заменяется более новым. Таким образом, вы можете использовать индекс как:

    int i = 0;
   while (I HAVE ROW) {
       hm.put(IMAGE+i, b);
       hm.put(TITLE+i, text);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...