Android实现快递物流跟踪布局效果

发布时间 - 2026-01-11 01:04:15    点击率:

先看效果

首页Activity

public class TraceActivity extends AppCompatActivity {

  private ListView lvTrace;
  private List<Trace> traceList = new ArrayList<>(10);
  private TraceListAdapter adapter;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_trace);
    findView();
    initData();
  }

  private void findView() {
    lvTrace = (ListView) findViewById(R.id.lvTrace);
  }

  private void initData() {
    // 模拟一些假的数据
    traceList.add(new Trace("2016年11月18日 上午12:04:01", "在湖北武汉洪山区光谷公司长江社区便民服务站进行签收扫描,快件已被 已签收 签收"));
    traceList.add(new Trace("2016年11月18日 上午11:57:25", "在湖北武汉洪山区光谷公司长江社区便民服务站进行派件扫描;派送业务员:老王;联系电话:17786550311"));
    traceList.add(new Trace("2016年11月17日 下午4:43:29", "在湖北武汉洪山区光谷公司进行快件扫描,将发往:湖北武汉洪山区光谷公司长江社区便民服务站"));
    traceList.add(new Trace("2016年11月17日 上午9:11:21", "从湖北武汉分拨中心发出,本次转运目的地:湖北武汉洪山区光谷公司"));
    traceList.add(new Trace("2016年11月17日 上午1:53:14", "在湖南长沙分拨中心进行装车扫描,即将发往:湖北武汉分拨中心"));
    traceList.add(new Trace("2016年11月17日 上午1:50:18", "在分拨中心湖南长沙分拨中心进行称重扫描"));
    traceList.add(new Trace("2016年11月16日 上午11:27:58", "在湖南隆回县公司进行到件扫描"));
    adapter = new TraceListAdapter(this, traceList);
    lvTrace.setAdapter(adapter);
  }
}

然后适配器

public class TraceListAdapter extends BaseAdapter {
  private Context context;
  private List<Trace> traceList = new ArrayList<>(1);
  private static final int TYPE_TOP = 0x0000;
  private static final int TYPE_NORMAL= 0x0001;

  public TraceListAdapter(Context context, List<Trace> traceList) {
    this.context = context;
    this.traceList = traceList;
  }

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

  @Override
  public Trace getItem(int position) {
    return traceList.get(position);
  }

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

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    final Trace trace = getItem(position);
    if (convertView != null) {
      holder = (ViewHolder) convertView.getTag();
    } else {
      holder = new ViewHolder();
      convertView = LayoutInflater.from(context).inflate(R.layout.item_trace, parent, false);
      holder.tvAcceptTime = (TextView) convertView.findViewById(R.id.tvAcceptTime);
      holder.tvAcceptStation = (TextView) convertView.findViewById(R.id.tvAcceptStation);
      holder.tvTopLine = (TextView) convertView.findViewById(R.id.tvTopLine);
      holder.tvDot = (TextView) convertView.findViewById(R.id.tvDot);
      holder.tv_new = (TextView) convertView.findViewById(R.id.tv_new);
      convertView.setTag(holder);
    }

    if (getItemViewType(position) == TYPE_TOP) {
      // 第一行头的竖线不显示
      holder.tvTopLine.setVisibility(View.INVISIBLE);
      holder.tv_new.setVisibility(View.VISIBLE);
      // 字体颜色加深
      holder.tvAcceptTime.setTextColor(context.getResources().getColor(R.color.red));
      holder.tvAcceptStation.setTextColor(context.getResources().getColor(R.color.red));
      holder.tvDot.setBackgroundResource(R.drawable.timelline_dot_secord);
    } else if (getItemViewType(position) == TYPE_NORMAL) {
      holder.tvTopLine.setVisibility(View.VISIBLE);
      holder.tv_new.setVisibility(View.INVISIBLE);
      holder.tvAcceptTime.setTextColor(0xff999999);
      holder.tvAcceptStation.setTextColor(0xff999999);
      holder.tvDot.setBackgroundResource(R.drawable.timelline_dot_first);
    }

    holder.tvAcceptTime.setText(trace.getAcceptTime());
    holder.tvAcceptStation.setText(trace.getAcceptStation());
    return convertView;
  }

  @Override
  public int getItemViewType(int id) {
    if (id == 0) {
      return TYPE_TOP;
    }
    return TYPE_NORMAL;
  }

  static class ViewHolder {
    public TextView tvAcceptTime, tvAcceptStation;
    public TextView tvTopLine, tvDot,tv_new;
  }
}

实体类

public class Trace {
  /** 时间 */
  private String acceptTime;
  /** 描述 */
  private String acceptStation;

  public Trace() {
  }

  public Trace(String acceptTime, String acceptStation) {
    this.acceptTime = acceptTime;
    this.acceptStation = acceptStation;
  }

  public String getAcceptTime() {
    return acceptTime;
  }

  public void setAcceptTime(String acceptTime) {
    this.acceptTime = acceptTime;
  }

  public String getAcceptStation() {
    return acceptStation;
  }

  public void setAcceptStation(String acceptStation) {
    this.acceptStation = acceptStation;
  }
}

activity布局和item布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:background="@android:color/white"
  tools:context="cc.duduhuo.timelinedemo.TraceActivity">

  <ListView
    android:id="@+id/lvTrace"
    android:layout_width="match_parent"
    android:divider="@null"
    android:clickable="false"
    android:listSelector="@android:color/transparent"
    android:dividerHeight="0dp"
    android:layout_height="wrap_content" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:orientation="horizontal">

  <RelativeLayout
    android:id="@+id/rlTimeline"
    android:layout_width="75dp"
    android:layout_height="match_parent">

    <TextView
      android:id="@+id/tvTopLine"
      android:layout_width="0.5dp"
      android:layout_height="12dp"
      android:layout_centerHorizontal="true"
      android:background="#999" />

    <TextView
      android:id="@+id/tvDot"
      android:layout_width="5dp"
      android:layout_height="5dp"
      android:layout_margin="2dp"
      android:layout_below="@id/tvTopLine"
      android:layout_centerHorizontal="true"
      android:background="@drawable/timelline_dot_normal" />

    <TextView
      android:layout_width="0.5dp"
      android:layout_height="match_parent"
      android:layout_below="@id/tvDot"
      android:layout_centerHorizontal="true"
      android:background="#999" />
    <TextView
      android:id="@+id/tv_new"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="最新"
      android:textColor="#ffffff"
      android:background="#ff0000"
      android:textSize="12sp"
      android:layout_marginLeft="3dp"
      android:paddingLeft="3dp"
      android:paddingRight="3dp"
      android:layout_toRightOf="@id/tvDot"
      android:layout_below="@id/tvTopLine"
      />
  </RelativeLayout>

  <RelativeLayout
    android:id="@+id/rlCenter"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="6dp"
    android:paddingRight="10dp"
    android:paddingLeft="10dp"
    android:paddingTop="6dp">

    <TextView
      android:id="@+id/tvAcceptTime"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="2014/06/24 20:55:28"
      android:textColor="#999"
      android:textSize="12sp" />

    <TextView
      android:id="@+id/tvAcceptStation"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@id/tvAcceptTime"
      android:layout_marginTop="5dp"
      android:text="在湖南隆回县公司进行到件扫描"
      android:textColor="#999"
      android:textSize="12sp" />
  </RelativeLayout>
</LinearLayout>

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


# android  # 物流跟踪  # 物流跟踪效果  # android物流跟踪源码  # Android快递物流信息布局开发  # Android实现快递单号查询快递状态信息  # Android自定义view仿淘宝快递物流信息时间轴  # Android实现快递物流时间轴效果  # android实现快递跟踪进度条  # Android实现仿美团、顺丰快递数据加载效果  # Android使用http请求手机号码归属地查询代码分享  # Android编程实现号码归属地查询的方法  # kotlin实现快递与号码归属地查询案例详解  # 湖北  # 隆回县  # 上午  # 长江  # 湖南  # 湖北武汉  # 发往  # 已被  # 称重  # 首页  # 先看  # 大家多多  # 老王  # 下午  # 实体类  # paddingTop  # 武汉洪  # return  # size  # getCount 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  高防服务器如何保障网站安全无虞?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  制作公司内部网站有哪些,内网如何建网站?  Laravel如何创建自定义Facades?(详细步骤)  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  动图在线制作网站有哪些,滑动动图图集怎么做?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  JavaScript实现Fly Bird小游戏  如何在阿里云香港服务器快速搭建网站?  网页设计与网站制作内容,怎样注册网站?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  微信小程序 require机制详解及实例代码  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Java垃圾回收器的方法和原理总结  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Python高阶函数应用_函数作为参数说明【指导】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  网站制作软件有哪些,制图软件有哪些?  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  如何在云主机上快速搭建多站点网站?  常州企业网站制作公司,全国继续教育网怎么登录?  大同网页,大同瑞慈医院官网?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Swift中循环语句中的转移语句 break 和 continue  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Linux网络带宽限制_tc配置实践解析【教程】  Laravel如何使用Sanctum进行API认证?(SPA实战)  使用豆包 AI 辅助进行简单网页 HTML 结构设计  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  南京网站制作费用,南京远驱官方网站?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何快速查询域名建站关键信息?  Laravel如何实现本地化和多语言支持?(i18n教程)  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何在不使用负向后查找的情况下匹配特定条件前的换行符  图册素材网站设计制作软件,图册的导出方式有几种?  使用spring连接及操作mongodb3.0实例  昵图网官网入口 昵图网素材平台官方入口  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  如何快速搭建高效可靠的建站解决方案?