Android仿淘宝订单页面效果

一般电商项目会涉及到的订单管理模块,类似淘宝样式的订单

主要是讲一下订单页面的实现。当然实现的方法有很多,我知道的有两种方法:一种是采用listview嵌套listview的方式,这种方式需要重写listview中onMearsure方法;还有一种是采用接口回调的方式,这种方式主要对后台返回的数据有依赖;

今天主要说下第二种方法:

实现的思想:首先Tab下面的布局还是用一个listview实现,然后将listview中的item分为上中下三部分内容;

创建三个xml文件,分别实现三个布局;第一部分为店铺名称那一栏,第二部分为商品信息那一栏,第三部分为订单状态那一栏;

然后创建一个回调接口

代码如下

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

利用接口回调分别实现三个布局

第一部分

public class ItemOrderTop implements OrderContent {
  private Order order;

  private OnceSendView2 shopImageView;
  private List<Order_goods> list;
  private ACache aCache;

  public ItemOrderTop(Order order, List<Order_goods> list) {

    this.order = order;
    this.list = list;
  }

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

  @Override
  public boolean isClickable() {
    return true;
  }

  public Order order() {
    return order;
  }

  @Override
  public View getView(final Context context, View convertView, LayoutInflater inflater) {
    aCache = ACache.get(context);
    inflater = LayoutInflater.from(context);
    convertView = inflater.inflate(getLayout(), null);

    final GTextView orderId = (GTextView) convertView.findViewById(R.id.tv_order_num1);

    GTextView orderstatus = (GTextView) convertView.findViewById(R.id.tv_order_state1);

    orderId.setText("订单号码:" + order.getOrder_sn());

    switch (order.getStatus().toString()) {
      case "20":
        orderstatus.setText("待发货");
        break;
      case "30":
        orderstatus.setText("已发货");
        break;
      case "40":
        orderstatus.setText("已收货待评价");
        break;
      default:
        break;

    }

    return convertView;
  }

}

中间部分

public class OrderIMiddle implements OrderContent {
  private Order_goods order_goods;
  private ImageLoader imageLoader;
  private DisplayImageOptions options;

  List<Order_goods> order_goodsList;
  private String status;

  public OrderIMiddle(Order_goods order_goods, String status) {
    this.order_goods = order_goods;
    order_goodsList = new ArrayList<Order_goods>();
    order_goodsList.add(order_goods);
    this.status = status;

    imageLoader = ImageLoader.getInstance();
    // 使用DisplayImageOptions.Builder()创建DisplayImageOptions
    options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.publicloading)
        .showImageForEmptyUri(R.drawable.publicloading)
        .showImageOnFail(R.drawable.publicloading)
        .cacheInMemory(true)
        .build();

  }

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

  @Override
  public boolean isClickable() {
    return true;
  }

  public Order_goods order_goods() {
    return order_goods;
  }

  @Override
  public View getView(final Context context, View convertView, LayoutInflater inflater) {

    inflater = LayoutInflater.from(context);
    convertView = inflater.inflate(getLayout(), null);

    GImageView mImage = (GImageView) convertView.findViewById(R.id.iv_goods_image1);
    GTextView goods_info = (GTextView) convertView.findViewById(R.id.tv_goods_info1);
    GTextView goods_attribute = (GTextView) convertView.findViewById(R.id.tv_goods_attribute1);
    GTextView goods_num = (GTextView) convertView.findViewById(R.id.tv_goods_num1);
    GTextView goods_price = (GTextView) convertView.findViewById(R.id.tv_goods_price1);

    goods_info.setText(order_goods.getGoods_name());
    goods_attribute.setText(order_goods.getSpecification());
    goods_num.setText("x" + order_goods.getQuantity());
    goods_price.setText("¥:" + order_goods.getPrice());
    Log.i("TAG", "order_goods.getOrder_id()=" + order_goods.getOrder_id());

    imageLoader.init(FileUtils.getCache(context));

    imageLoader.displayImage(order_goods.getGoods_image(), mImage, options);

    convertView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        switch (status) {
          case "40":
            Intent intent = new Intent(context, Message_Logistics.class);
            intent.putExtra("order_id", order_goods.getOrder_id());
            context.startActivity(intent);
            break;
          case "30":
            Intent intent2 = new Intent(context, Message_Logistics.class);
            intent2.putExtra("order_id", order_goods.getOrder_id());
            context.startActivity(intent2);
            break;
          case "20":
            Intent intent3 = new Intent(context, Message_Delivery.class);
            intent3.putExtra("order_id", order_goods.getOrder_id());
            context.startActivity(intent3);
            break;
          default:
            break;
        }

      }
    });

    return convertView;
  }

}

底部:

public class OrderBottom implements OrderContent {

  private Order order;

  private OnceSendView2 shopImageView;
  private List<Order_goods> list;
  private ACache aCache;

  public OrderBottom(Order order, List<Order_goods> list) {

    this.order = order;
    this.list = list;
  }

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

  @Override
  public boolean isClickable() {
    return true;
  }

  public Order order() {
    return order;
  }

  @Override
  public View getView(final Context context, View convertView, LayoutInflater inflater) {
    aCache = ACache.get(context);
    inflater = LayoutInflater.from(context);
    convertView = inflater.inflate(getLayout(), null);

    GTextView orderTotal = (GTextView) convertView.findViewById(R.id.tv_order_amount1);
    GTextView tv_order_datetime = (GTextView) convertView.findViewById(R.id.tv_order_datetime);
    final GButton oncesend = (GButton) convertView.findViewById(R.id.btn_send1);
    GTextView yunfei_text = (GTextView) convertView.findViewById(R.id.yunfei_text);

    yunfei_text.setText("(含运费: ¥ "+order.getShipping_fee()+")");

    orderTotal.setText(order.getOrder_amount());
    tv_order_datetime.setText(Data_Time.getDateToString(order.getAdd_time()));
    final View finalConvertView = convertView;
    if (order.getStatus().equals("20")) {
      oncesend.setText("立即发货");

      oncesend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

          Intent otherintent = new Intent(context, Message_Delivery.class);
          otherintent.putExtra("order_id", order.getOrder_id());
          otherintent.putExtra("token", aCache.getAsString("token"));
          context.startActivity(otherintent);
        }
      });
    } else if (order.getStatus().equals("30")){
      oncesend.setBackgroundResource(R.color.highlight_color);
      oncesend.setText("查看物流");
      oncesend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          Intent intent = new Intent(context, Message_Logistics.class);
          intent.putExtra("order_id", order.getOrder_id());
          context.startActivity(intent);
        }
      });

    }
    else
    {
      oncesend.setVisibility(View.GONE);

    }

    return convertView;
  }

}

接收接口返回的数据,然后利用for循环将数据循环读入到上中下三个布局中

//解析后台返回的数据
    Type tp = new TypeToken<OrderItems>() {
    }.getType();
    OrderItems goodsItem = (OrderItems) ParseUtils.Gson2Object(s, tp);
    List<OrderItems> orderItems = new ArrayList<OrderItems>();

    orderItems.add(goodsItem);
    List<OrderContent> orderContents;
    List<Order> orderList = new ArrayList<Order>();

    if (goodsItem.getData() != null) {
      orderList = goodsItem.getData().getOrders();
      orderContents = new ArrayList<OrderContent>();
      List<Order_goods> orderGoodses = new ArrayList<Order_goods>();
      int totalPages = goodsItem.getData().getPage().getPage_count();

      //外部第一个循环,将数据循环读取后存到订单顶部
      for (int k = 0; k < orderList.size(); k++) {
        orderGoodses = orderList.get(k).getOrder_goods();
        Order ordertop = new Order();
        ordertop.setOrder_sn(orderList.get(k).getOrder_sn());
        ordertop.setStatus(orderList.get(k).getStatus());
        ordertop.setEvaluation_status(orderList.get(k).getEvaluation_status());
        ItemOrderTop itemOrderTop = new ItemOrderTop(ordertop, orderGoodses);
        orderContents.add(itemOrderTop);

        if (orderGoodses == null) {
          BaseUtil.showToast(context, "没有订单");
        } else {
          //中间for循环,将数据循环读取后存到订单中间部分
          for (int j = 0; j < orderGoodses.size(); j++) {
            Order_goods goods = new Order_goods();
            goods.setPrice(orderGoodses.get(j).getPrice());
            goods.setGoods_name(orderGoodses.get(j).getGoods_name());
            goods.setQuantity(orderGoodses.get(j).getQuantity());
            goods.setGoods_image(orderGoodses.get(j).getGoods_image());
            goods.setSpecification(orderGoodses.get(j).getSpecification());
            goods.setOrder_id(orderGoodses.get(j).getOrder_id());
            OrderIMiddle orderIMiddle = new OrderIMiddle(goods,   orderList.get(k).getStatus());
            orderContents.add(orderIMiddle);
            Log.i("myLog", "orderContents =" + orderContents);
          }
        }
        //外部第二个循环,将数据循环读取后存到订单底部
        Order order = new Order();
        order.setOrder_sn(orderList.get(k).getOrder_sn());
        order.setOrder_id(orderList.get(k).getOrder_id());
        order.setStatus(orderList.get(k).getStatus());
        order.setAdd_time(orderList.get(k).getAdd_time());
        order.setOrder_amount(orderList.get(k).getOrder_amount());
        order.setShipping_fee(orderList.get(k).getShipping_fee());
        OrderBottom orderBottom = new OrderBottom(order, orderGoodses);
        orderContents.add(orderBottom);

      }
      mUpdateListview(orderContents, mOrderAdapter, mListView, page, totalPages);

    } else {
      BaseUtil.showToast(context, "没有订单");
    }
}

然后利用setAdapter方法将数据传到Adapter中。

以下是Adapter的实现方法

public class OrderParentListAdapter extends BaseAdapter {

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

  public OrderParentListAdapter(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 boolean isEnabled(int position) {
    // TODO Auto-generated method stub
    return orderContents.get(position).isClickable();
  }

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

  public void upateList(List<OrderContent> orderContents) {
    // TODO Auto-generated method stub
    this.orderContents.addAll(orderContents);
    this.notifyDataSetChanged();
  }

  public void clearListView() {
    // TODO Auto-generated method stub
    this.orderContents.clear();
  }

}

最后,使用此方法需要和接口沟通好数据返回的格式;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android自定义view制作抽奖转盘

    本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplication.turntable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; im

  • Android自定义View实现饼状图带动画效果

    一个简单的自定义view饼状图,加入了动画效果 先看一下效果 下面就直接上代码了 public class Yidong2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new PointView(this)); } public class PointView

  • 关于Touch Panel AA区要做外扩的原因解析

    Touch Panel即是触摸屏的面板,面板在设计的时候就会有一定的规范. 如上两幅图所示: AA  :   Active  Area的英文缩写,表示触摸屏的动作区,也就是我们手可以触摸面板,能够被检测到的区域. VA  :  View Area的英文缩写,表示屏体可视区域. OD :   Outside  Dimensional的英文缩写,表示触摸屏体外形尺寸. Sensor:装饰玻璃下有触摸功能的部件,通常就是一些ITO组成的电极,由各种各样的图案构成发射通道和感应通道,这些ITO图案一般式

  • Android使用AsyncTask加载图片的操作流程

    加载图片基本操作 一.创建AsyncTask子类 将ImageView的弱引用设置为成员变量,创建构造函数传入ImageView对象. 调用指定大小解析Bitmap方法. 因为是弱引用,所以必须判断引用是否被回收.如果异步任务完成前,用户离开Activity或者设置发生改变,ImageView也可能不存在. class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference&

  • Android Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STATE监听自己的Usb连接的设备,只针对Usb设备.而想要监听外部设备的时候却需要另外的两个广播进行监听"android.hardware.usb.action.USB_DEVICE_ATTACHED"和"android.hardware.usb.action.USB_DEVICE

  • Android开发手机无线调试的方法

    是不是还在为了手机usb被占用而不能链接编译器而难过?是不是感觉无线调试遥不可及? 读完下面的几步 让你轻松掌握无线调试. 1. 首先将你的手机连接到无线网 2. 将你的手机链接到电脑上 3. Window 配置好adb Linux 安装好adb 4. 确认手机链接到无线网络需要和你的电脑在同一个无线网络内 5. 在命令端输入 $ adb tcpip 5555 (5555为端口号,可以自由指定) 然后在输如下命令 $ adb tcpip 此时你可以查看到 自己手机的ip地址 大概如下所示 10.

  • Android通过代码控制ListView上下滚动的方法

    本文将介绍一种通过代码控制ListView上下滚动的方法. 先上图: 按下按钮会触发ListView滚动或停止. 实现该功能并不难,下面给出主要代码MainActivity.java package cn.guet.levide; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View;

  • Android底部导航栏的动态替换方案

    Android底部导航栏的动态替换方案,供大家参考,具体内容如下 1.通常来说,一般情况下,我们的app的BottomTab会有下面几种实现方式. 1).自定义view,然后自己写逻辑去实现互斥. 2).使用RadioGroup+RadioButton去实现底部的Tab. 自由度比极高,如果想实现搞复杂度的话可以重写 RadioButton. 3).使用google design包里面的 TabLayout去实现. 可上.可下.可以滑动 偷懒的话可以根据已有api来设置一些资源,也可以 setC

  • Android实现自动填充短信验证码功能

    前言 短信验证码获取并自动填写现在已经成为一个人性化App的标配了,这篇文章将实现一个短信验证码获取并自动填写的demo.其实就是读取指定号码的短信并提取出验证码,然后赋值给EditText显示. demo效果图: 读取短信 Android系统在接受到一条短信的时候会发出一条Action为android.provider.Telephony.SMS_RECEIVED的有序广播,因此我们读取短信的验证码只需要监听这个广播然后提取出短信中的验证码即可,如: /** * Created by 程龙 o

  • Android通过ExifInterface判断Camera图片方向的方法

    Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向 图像的Sensor方向:手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横放时的左上角: android应用里使用相机图片时必须要考虑的一个问题就是图片朝向,只有判断对朝向才能调整图片从而更好的展现.本文将介绍一种通过ExifInterface判断图片朝向的

随机推荐