Объединение нескольких строк вместе в ListView, если они соответствуют определенным критериям?

У меня есть ListView при этом отслеживается уплаченная сумма, если пользователь дважды производит платеж с использованием одного и того же типа платежа, тогда эти две записи в списке должны быть объединены в единое целое и добавлена ​​сумма.

Payment 1 - $50  - Check
Payment 2 - $100 - Check

Выше выглядит так в ListView:

$150 - Check
$50 - Check

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

Вот соответствующий код из моего метода обновления и getView метод из класса Adapter, который расширяет ArrayAdapter<ClassObject>,

GetView()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.fragment_payscreen_tab2_listgrid_row, null);
    }

    //Get item from list 
    InvoiceListModel item = this.getItem(position);
    if (item != null) {
        TextView txtAmount        = (TextView)v.findViewById(R.id.PayScreen_Tab2_Columns_txtAmount);
        TextView txtPaidBy        = (TextView)v.findViewById(R.id.PayScreen_Tab2_Columns_txtPaidBy);

        txtPaidBy.setText(item.paidBy);
        txtAmount.setText(item.amount);
    }

    return v;
}

Пользовательский метод обновления адаптера

 public boolean update(InvoiceListModel object){
        for(int x=0; x< uiListViewCollectionData.size(); x++){
            InvoiceListModel tempObj = uiListViewCollectionData.get(x);
            if(tempObj != null &&
               tempObj.paidBy.equals(object.paidBy)){

                //Set the data on the temp object
                tempObj.amount  = uiListViewCollectionData.get(x).amount.plus(object.amount);

                //Remove the old outdated object from datasource
                uiListViewCollectionData.remove(x);
                this.notifyDataSetChanged();

                //Add the new model containing the new amount back to list
                uiListViewCollectionData.add(tempObj);
                this.notifyDataSetChanged();

                return true;
            }
        }
        return false;
    }

я точно уверен notifyDataSetChanged() является async и это приводит к быстрому выполнению следующей строки. Можно ли напрямую визуализировать ListView UI компонент прямо тогда и там, как только мне это нужно?

1 ответ

Решение

Как вы передаете данные в список?

Вы должны "упаковать" свои old_data и передать new_data адаптеру. Что-то вроде:

new_data = repack (old_data);
myAdapter = new MyAdapter(new_data);

Итак, если у old_data есть 50 элементов, у новых данных будет только 35 (как пример), и вы представите эти 35 элементов в списке. Логика слияния должна быть вне getView().

Другие вопросы по тегам