Обновление списка <HashMap> - PullRequest
       7

Обновление списка <HashMap>

0 голосов
/ 10 октября 2010

Я просто хочу знать, как, если Hashmap уже есть в списке, добавить 1 к количеству, если его нет, добавить его в список.Это то, что я сделал, просто добавив событие, хотя элемент уже находится в списке.

list = new ArrayList<HashMap<String, String>>();
Cursor c = db.rawQuery("SELECT code,desc,price FROM TbLPrice WHERE code =" + txtCode.getText().toString(), null);  //search database
                if (c.moveToFirst()){ //if successful
                    txtDesc.setText(c.getString(1)); //get desc 
                    txtPrice.setText(c.getString(2)); // get price @ database
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("desc", c.getString(1));
                    map.put("price", c.getString(2));
                    map.put("quantity","1");
                    list.add(map);
                    adapter.notifyDataSetChanged();

Ответы [ 2 ]

0 голосов
/ 11 октября 2010

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

public class MyItem
{
    String description;
    float price;
    int quantity;

    public void setDescription(String description)
    {
        this.description = description;
    }

    public void setPrice(float price)
    {
        this.price = price;
    }

    public void setQuantity(int quantity)
    {
        this.quantity = quantity;
    }

    public void increaseQuantity()
    {
        this.quantity++;
    }

    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((description == null) ? 0 : description.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyItem other = (MyItem) obj;
        if (description == null)
        {
            if (other.description != null)
                return false;
        }
        else if (!description.equals(other.description))
            return false;
        return true;
    }
}

Я реализовал метод equals (и тогда также обычно реализуется метод hash), чтобы можно было легко проверить, существует ли элемент в списке (для простоты яПредположим, что description однозначно идентифицирует элемент, вы должны изменить его при необходимости).Затем вы можете продолжить обработку следующим образом:

public void queryForItem(String itemCode)
{
    Cursor cursor = db.rawQuery("SELECT code,desc,price FROM TbLPrice WHERE code =" + itemCode, null);
    if (cursor.moveToFirst())
    {
        processCursor(cursor);
    }
    cursor.close();
}

private void processCursor(Cursor c)
{
    MyItem newItem = new MyItem();
    newItem.setDescription(c.getString(1));
    newItem.setPrice(c.getFloat(2));
    newItem.setQuantity(1);

    // assuming that items (ArrayList<MyItem>) is defined and initialized earlier in the code
    int existingItemIndex = items.indexOf(newItem);
    if (existingItemIndex >= 0)
    {
        items.get(existingItemIndex).increaseQuantity();
    }
    else
    {
        items.add(newItem);
    }
    adapter.notifyDataSetChanged();
}

Я не проверял это никоим образом, но, думаю, он должен делать то, что вы хотите.Надеюсь, вы сможете увидеть логику в этом :)

0 голосов
/ 10 октября 2010

Я придумал это решение, однако, если элемент существует, он обновляет количество только 2 раза с 3-й попытки. Создает новый элемент списка с тем же самым desc, ценой, но 1 количеством.

Cursor c = db.rawQuery("SELECT code,desc,price FROM TbLPrice WHERE code =" + txtCode.getText().toString(), null);  //search database
            if (c.moveToFirst()){ //if successful
                txtDesc.setText(c.getString(1)); //get desc 
                txtPrice.setText(c.getString(2)); // get price @ database
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("desc", c.getString(1));
                map.put("price", c.getString(2));

if(list.isEmpty()){
                    map.put("quantity","1");
                    list.add(map);
                    adapter.notifyDataSetChanged();
                }
                else{
                    if(list.contains(map)){
                        int loc = list.indexOf(map);
                        Object o = list.get(loc);
                        @SuppressWarnings("unchecked")
                        HashMap<String, String> map2 = (HashMap<String, String>)o;
                        String b = (String) map2.get("quantity");
                        int quantity = Integer.parseInt(b) + 1;
                        map2.put("quantity", Integer.toString(quantity));
                        adapter.notifyDataSetChanged();

                    }
                    else{
                        map.put("quantity","1");
                        list.add(map);
                        adapter.notifyDataSetChanged();
                    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...