ListView嵌套ListView

来源:互联网 发布:学plc编程 编辑:程序博客网 时间:2024/06/04 20:45

在项目开发当中,我们总是会遇到这样的需求:在list表单中,它的子item也会list,比如这个效果图

这里写图片描述

那么,我们如何来实现呢?

第一个种思路:

这里写图片描述

我们将它看成一个实体类,然后在adapter中当前的item和下一个item的店铺名字进行匹配,如果店铺名字一致,我们就控制店铺名字和欠款不显示,反之,则显示。这个比较容易实现,我就不进行代码展示了。

第二种思路:listView嵌套listView,我们分成两个实体类,一个是包含:订单号、主子账号、付款方式等等的实体类statementOfAccountItem,另一个是包含:店铺名称、店铺金额和statementOfAccount列表的实体类statementOfAccount。

adapter的主要代码

public class StatementOfAccountItemAdapter extends BaseAdapter {    private Context context;    private List<StatementOfAccount> mData;    public StatementOfAccountItemAdapter(List<StatementOfAccount> mData, Context context) {        this.mData = mData;        this.context = context;    }    public void AdapterNofy(List<StatementOfAccount> list) {        this.mData = list;        this.notifyDataSetChanged();    }    @Override    public int getCount() {        return mData.size();    }    @Override    public Object getItem(int position) {        return mData.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    public void notifyAdapter(List<StatementOfAccount> list) {        this.mData = list;        this.notifyDataSetChanged();    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        viewHolder vHolder = null;        LayoutInflater inflater = LayoutInflater.from(context);        if (null == convertView) {            convertView = inflater.inflate(R.layout.activity_statement_of_account_item, null);            vHolder = new viewHolder(convertView);            convertView.setTag(vHolder);        } else {            vHolder = (viewHolder) convertView.getTag();        }        //捆绑数据        StatementOfAccount item = mData.get(position);        vHolder.phone_store_name.setText(item.getShopName());        vHolder.phone_store_arrears.setText(item.getTotalArrears());        List<StatementOfAccountItem> itemList = item.getList();        StatementOfAccountItemTwoAdapter adapter = new StatementOfAccountItemTwoAdapter(itemList, context);        vHolder.listView.setAdapter(adapter);        //重新计算listView的高度,子listview必须是linearLayout        ListAdapterUtility.setListViewHeightBaseOnChildren(vHolder.listView);        return convertView;    }    public class viewHolder {        // 店铺名字        @Bind(R.id.accout_item_phone_store_name)        TextView phone_store_name;        // 店铺欠款金额        @Bind(R.id.accout_item_phone_store_arrears)        TextView phone_store_arrears;        @Bind(R.id.statement_account_list)        ListView listView;        public viewHolder(View view) {            ButterKnife.bind(this, view);        }    }}

重新计算adapter高度的方法类

public class ListAdapterUtility {    public static void setListViewHeightBaseOnChildren(ListView listView) {        ListAdapter listAdapter = listView.getAdapter();        if (listAdapter == null) {            return;        }        int totalHeight = 0;        for (int i = 0; i < listAdapter.getCount(); i++) {            View listItem = listAdapter.getView(i, null, listView);            listItem.measure(0, 0);            totalHeight += listItem.getMeasuredHeight();        }        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight + (listView.getDividerHeight() + (listAdapter.getCount() - 1));        listView.setLayoutParams(params);    }}
0 0
原创粉丝点击