Android listview 一个item加载多个布局

由于项目需要,有个页面里面的内容需要用Listview显示,但是每个item里面又有像listview那样的内容显示。所以网上查了很多资料,有说用Listview嵌套Listview做,也有我们说的这种,加载多个布局。

这里实现的listview类似淘宝订单那种。每个item里面有小的item个数不确定。可以使用listview嵌套listview那样做,但是可能会有问题。所以用这种加载不同布局来做。


中间的商品个数会不固定,所以不好实现,就用了这个加载多个布局来实现。



1.新建接口

这里就2个方法,根据具体项目需求可以加别的。

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;

public interface OrderContent {
    public int getLayout();
    public View getView(Context context, View convertView, LayoutInflater inflater);
}

2.添加布局。

要准备3给布局,分别对应上图中的三个部分。


3.实现接口

这里我们把整个item分为3个部分,所以新建3个类来实现接口。这里就给出一个。Top/Middle/Bottom

public class OrderTop implements OrderContent {

    private TakeawayOrderDetailsItem item;    //对应的数据结构的类

    public OrderTop(TakeawayOrderDetailsItem item) {
        this.item = item;
    }

    @Override
    public int getLayout() {
        return R.layout.order_details_item_top;
    }

    @Override
    public View getView(Context context, View convertView, LayoutInflater inflater) {
        ViewHolder holder = null;
        if (inflater == null) {
            inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(getLayout(), null);
            holder = new ViewHolder();
            holder.orderAmount= (TextView) convertView.findViewById(R.id.order_amount);
            holder.name = (TextView) convertView.findViewById(R.id.order_name);
            holder.address = (TextView) convertView.findViewById(R.id.order_address);
            holder.status = (TextView) convertView.findViewById(R.id.order_status);
            holder.number = (TextView) convertView.findViewById(R.id.order_number);
            holder.time = (TextView) convertView.findViewById(R.id.order_time);
            holder.paymentTime = (TextView) convertView.findViewById(R.id.payment_time);
            holder.deliveryTime = (TextView) convertView.findViewById(R.id.delivery_time);
            holder.goodsNumber = (TextView) convertView.findViewById(R.id.goods_number);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.orderAmount.setText("¥"+ AmountUtil.toAmount(item.getAmount()));
        holder.name.setText(item.getContact());
        holder.address.setText(item.getAddress());
        holder.status.setText(""+item.getStatus());
        holder.number.setText(item.getOrder_number());
        holder.time.setText(getDateToString(item.getOrderTime(),"yyyy-MM-dd HH:mm:ss"));
        holder.goodsNumber.setText("("+item.getQuantity()+")");

        return convertView;
    }

    public static String getDateToString(long milSecond, String pattern) {
        Date date = new Date(milSecond);
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(date);
    }

    static class ViewHolder {
        TextView name;
        TextView address;
        TextView status;
        TextView number;
        TextView time;
        TextView paymentTime;
        TextView deliveryTime;
        TextView goodsNumber;
        TextView orderAmount;
    }
}

4.Adapter实现


public class OrderDetailsAdapter extends BaseAdapter {

    private Context context;
    private List<OrderContent> orderContents;
    private LayoutInflater mIflater;

    public OrderDetailsAdapter(Context context, List<OrderContent> orderContents) {
        this.context = context;
        if (orderContents != null) {
            this.orderContents = orderContents;

        } else {
            this.orderContents = new ArrayList<OrderContent>();

        }
    }

    @Override
    public int getCount() {
        return orderContents.size();
    }

    @Override
    public Object getItem(int position) {
        return orderContents.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return orderContents.get(position).getView(context,convertView,mIflater);
    }
}

5.Activity加载数据

初始化

        orderContents = new ArrayList<OrderContent>();
        mAdapter = new OrderDetailsAdapter(mContext, orderContents);

        listView.setAdapter(mAdapter);

加载数据

        //加载头部
        OrderDetailsTop top = new OrderDetailsTop(detailsItem);
        orderContents.add(top);
        //加载中间部分,商品详情
        for (OrderDetailsOrderItem item : items) {
            OrderDetailsMiddle middle = new OrderDetailsMiddle(item);
            orderContents.add(middle);
        }
        OrderDetailsBottom bottom = new OrderDetailsBottom(detailsItem);
        orderContents.add(bottom);
        //加载底部

        mAdapter.notifyDataSetChanged();


我们这里的Listview就显示一个item,所以加载数据的时候最外面没有加循环加载数据。

这里首先把数据加载到top的布局里面,然后根据商品个数来加载中间的布局,最后加载底部布局。

大体思路就是这样的,具体代码根据项目来写。


阅读更多

没有更多推荐了,返回首页