由于项目需要,有个页面里面的内容需要用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的布局里面,然后根据商品个数来加载中间的布局,最后加载底部布局。
大体思路就是这样的,具体代码根据项目来写。