android自助点单APP(3)ListView中嵌套ListView

首先上效果图
这里写图片描述
这里写图片描述

首先外层ListView放置的是不同订单,这个lisiview中的item中又放置了一个listview用于显示订单中的已购列表。同时点击底部按钮能够展开,展开之后再次点击能收起。

这是item中listview的adapter

package com.lvkang.adapter;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.lvkang.myfood.json.OrderFood;
import com.lvkang.myfoodtoandroid.R;

public class OrderedFoodAdapter extends BaseAdapter {
    Context mContext;
    private List<OrderFood> orderFoods = new ArrayList<OrderFood>();

    private LayoutInflater mInflater;
    private orderFoodHolder orderFoodHolder;
    private int orderFoodListViewItem;

    private class orderFoodHolder {
        TextView foodPrice;
        TextView foodName;
        TextView foodUnitPrice;
        TextView number;

    }

    //这里传入的数据是List<OrderFood> 
    public OrderedFoodAdapter(Context c, List<OrderFood> orderFoods,int orderFoodListViewItem) {
        this.mContext = c;
        this.orderFoods = orderFoods;
        this.orderFoodListViewItem = orderFoodListViewItem;
        mInflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return orderFoods.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return orderFoods.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView != null) {
            orderFoodHolder = (orderFoodHolder) convertView.getTag();
        } else {

            convertView = mInflater.inflate(orderFoodListViewItem, null);
            orderFoodHolder = new orderFoodHolder();
            orderFoodHolder.foodName = (TextView) convertView
                    .findViewById(R.id.ordered_food_name);
            orderFoodHolder.foodPrice = (TextView) convertView
                    .findViewById(R.id.ordered_food_price);
            orderFoodHolder.foodUnitPrice = (TextView) convertView
                    .findViewById(R.id.ordered_food_unitprice);
            orderFoodHolder.number = (TextView) convertView
                    .findViewById(R.id.ordered_food_num);

            convertView.setTag(orderFoodHolder);
        }

        if (orderFoods != null) {
            int num = orderFoods.get(position).getOrderFoodNum();
            float unitprice = orderFoods.get(position).getOrderFoodUnitPrice();

            float price = num * unitprice;
            orderFoodHolder.foodName.setText(orderFoods.get(position)
                    .getOrderFoodName());

            orderFoodHolder.foodPrice.setText(price + "");

            orderFoodHolder.foodUnitPrice.setText(unitprice + "");
            orderFoodHolder.number.setText(num + "");

        }

        return convertView;

    }
}

外层listview的adapter

package com.lvkang.adapter;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.lvkang.myfood.json.OrderFood;
import com.lvkang.myfood.json.OrderFoods;
import com.lvkang.myfood.utils.Print;
import com.lvkang.myfoodtoandroid.R;

public class OrderedFoodListAdapter extends BaseAdapter {
    Context mContext;
    private List<OrderFoods> orderFoodsList = new ArrayList<OrderFoods>();
    // 记录被展开/收起按钮的状态,防止convertview被复用后,展开状态消失(就是滚动页面后再返回,展开状态消失)
    private int[] selectedPosition;

    private LayoutInflater mInflater;
    private orderHolder orderHolder;
    // adapter的布局文件
    private int infoListViewItem;
    // item中adapter的布局文件
    private int orderFoodListViewItem;
    // 每个item的高度,最好换成动态获取每个item的高度
    private static final int itemHeight = 136;

    private class orderHolder {
        TextView timeTextView;
        TextView dateTextView;
        TextView tableIDTextView;
        TextView priceTextView;
        TextView numtextView;
        TextView snTextView;
        TextView remarkstexTextView;
        TextView remarkstexTextViewHint;
        ListView orderedFoodsListView;
        Button orderedListviewButton;
    }


    class lvButtonListener implements View.OnClickListener {
        private int itemNum;
        private ListView listView;
        private RelativeLayout.LayoutParams params;
        private Button button;
        private int position;

        lvButtonListener(int position, int itemNum, ListView listView) {
            this.itemNum = itemNum;
            this.listView = listView;
            this.position = position;
        }

        @Override
        // 复写onClick方法用来监听按钮
        public void onClick(View v) {
            int vid = v.getId();
            button = (Button) v;
            if (vid == orderHolder.orderedListviewButton.getId()) {

                if (selectedPosition[position] ==0) {

                    params = (RelativeLayout.LayoutParams) listView
                            .getLayoutParams();

                    button.setText("点击收起" + (itemNum - 2 + "项"));

                    params.height = itemNum * itemHeight;
                    selectedPosition[position] = 1;

                } else if (selectedPosition[position] ==1) {
                    params = (RelativeLayout.LayoutParams) listView
                            .getLayoutParams();
                    button.setText("点击展开" + (itemNum - 2 + "项"));

                    params.height = 2 * itemHeight;
                    selectedPosition[position] = 0;

                }

                listView.setLayoutParams(params);

            }

        }
    }

    public OrderedFoodListAdapter(Context c, List<OrderFoods> orderFoodsList,
            int infoListViewItem, int orderFoodListViewItem) {
        this.mContext = c;
        this.orderFoodsList = orderFoodsList;
        this.infoListViewItem = infoListViewItem;
        this.orderFoodListViewItem = orderFoodListViewItem;
        mInflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        selectedPosition = new int[orderFoodsList.size()];

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return orderFoodsList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return orderFoodsList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView != null) {
            orderHolder = (orderHolder) convertView.getTag();

        } else {
            convertView = mInflater.inflate(infoListViewItem, null);
            orderHolder = new orderHolder();
            orderHolder.numtextView = (TextView) convertView
                    .findViewById(R.id.num_textview);
            orderHolder.priceTextView = (TextView) convertView
                    .findViewById(R.id.price_textview);
            orderHolder.remarkstexTextView = (TextView) convertView
                    .findViewById(R.id.remarks_textview);
            orderHolder.remarkstexTextViewHint = (TextView) convertView
                    .findViewById(R.id.remarks_textview_hint);
            orderHolder.snTextView = (TextView) convertView
                    .findViewById(R.id.sn_textview);
            orderHolder.tableIDTextView = (TextView) convertView
                    .findViewById(R.id.tableid_textview);
            orderHolder.dateTextView = (TextView) convertView
                    .findViewById(R.id.date_textview);
            orderHolder.orderedFoodsListView = (ListView) convertView
                    .findViewById(R.id.ordered_list_view);
            orderHolder.orderedListviewButton = (Button) convertView
                    .findViewById(R.id.ordered_listview_button);
            orderHolder.timeTextView=(TextView) convertView.findViewById(R.id.time_textview);
            convertView.setTag(orderHolder);

        }
        if (orderFoodsList != null) {

            int addNum = 0;
            float addPrice = 0;
            int num = 0;
            float price = 0;

            List<OrderFood> orderFoods = orderFoodsList.get(position)
                    .getFoodList();
            for (OrderFood orderFood : orderFoods) {

                num = orderFood.getOrderFoodNum();
                price = orderFood.getOrderFoodUnitPrice();

                addNum += num;
                addPrice += num * price;

            }

            orderHolder.numtextView.setText(addNum + "份");

            SpannableStringBuilder builder = new SpannableStringBuilder(
                    addPrice + "元");

            // ForegroundColorSpan 为文字前景色,BackgroundColorSpan为文字背景色
            ForegroundColorSpan redSpan = new ForegroundColorSpan(Color.RED);

            builder.setSpan(redSpan, 0, builder.length() - 1,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            orderHolder.priceTextView.setText(builder);
            String orderedRemarks = orderFoodsList.get(position)
                    .getOrderRemarks();

            if (orderedRemarks.length() > 0) {
                orderHolder.remarkstexTextView.setText(orderedRemarks);
                orderHolder.remarkstexTextViewHint.setVisibility(View.VISIBLE);

                orderHolder.remarkstexTextView.setVisibility(View.VISIBLE);
            } else {
                orderHolder.remarkstexTextViewHint.setVisibility(View.GONE);

                orderHolder.remarkstexTextView.setVisibility(View.GONE);
            }

            String orderID = orderFoodsList.get(position).getOrderId() + "";
            orderHolder.snTextView.setText(orderID.substring(
                    orderID.length() - 4, orderID.length()));
            orderHolder.tableIDTextView.setText(orderFoodsList.get(position)
                    .getOrderTableId() + "号");
            String dateTimeString=(orderFoodsList.get(position)
                    .getOrderDateTime());

            orderHolder.dateTextView.setText(dateTimeString.substring(2, 10));

            orderHolder.timeTextView.setText(dateTimeString.substring(11, 19));

            if (orderFoods != null && orderFoods.size() > 0) {

                OrderedFoodAdapter orderedFoodAdapter = new OrderedFoodAdapter(
                        mContext, orderFoods, orderFoodListViewItem);
                orderHolder.orderedFoodsListView.setAdapter(orderedFoodAdapter);

                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) orderHolder.orderedFoodsListView
                        .getLayoutParams();
                // selectedPosition[position] == 0表示不是展开状态
                if (selectedPosition[position] == 0) {

                    switch (orderFoods.size()) {
                    case 1:
                        params.height = itemHeight;
                        orderHolder.orderedListviewButton
                                .setVisibility(View.GONE);

                        break;
                    case 2:
                        params.height = 2 * itemHeight;
                        orderHolder.orderedListviewButton
                                .setVisibility(View.GONE);

                        break;

                    default:
                        params.height = 2 * itemHeight;
                        orderHolder.orderedListviewButton
                                .setVisibility(View.VISIBLE);
                        orderHolder.orderedListviewButton.setText("点击展开"
                                + (orderFoods.size() - 2) + "项");
                        orderHolder.orderedListviewButton
                                .setOnClickListener(new lvButtonListener(
                                        position, orderFoods.size(),
                                        orderHolder.orderedFoodsListView));

                        break;
                    }
                    // selectedPosition[position] == 0表示是展开状态

                } else if (selectedPosition[position] == 1) {
                    switch (orderFoods.size()) {
                    case 1:
                        params.height = itemHeight;
                        orderHolder.orderedListviewButton
                                .setVisibility(View.GONE);

                        break;
                    case 2:
                        params.height = 2 * itemHeight;
                        orderHolder.orderedListviewButton
                                .setVisibility(View.GONE);

                        break;

                    default:
                        params.height = orderFoods.size() * itemHeight;
                        orderHolder.orderedListviewButton
                                .setVisibility(View.VISIBLE);
                        orderHolder.orderedListviewButton.setText("点击收起"
                                + (orderFoods.size() - 2) + "项");
                        orderHolder.orderedListviewButton
                                .setOnClickListener(new lvButtonListener(
                                        position, orderFoods.size(),
                                        orderHolder.orderedFoodsListView));

                        break;
                    }

                }

                orderHolder.orderedFoodsListView.setLayoutParams(params);
                Print.P(orderHolder.orderedFoodsListView.getHeight() + "");
            }

        }

        return convertView;

    }

}

使用效果来看还是挺流畅的。
主要就是两个holder用于记录控件id。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值