如果ListView符合特定条件,则在ListView中将多个行合并在一起?

时间:2016-06-27 18:33:41

标签: android listview android-arrayadapter

我有ListView跟踪已支付的金额,如果用户使用相同类型的付款进行两次付款,则列表中的这两个条目应合并为一个并添加金额。

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

以上在ListView中看起来如此:

$150 - Check
$50 - Check

所以金额确实被添加但我删除持有50美元金额的行的逻辑不起作用......不太确定为什么,但重点是将它们合并在一起并删除那个持有50美元的不必要的行。

以下是我的更新方法中的相关代码以及扩展getView的适配器类中的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 个答案:

答案 0 :(得分:1)

如何将数据传递到列表?

你应该重新包装&#39;你的old_data并将new_data传递给适配器。类似的东西:

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

因此,如果old_data有50个项目,则新数据将只有35个(例如),并且您在列表中显示这35个项目。合并逻辑应该不在getView()中。