Объединение нескольких строк вместе в 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().