ListView实现物流追踪

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50969789 目前我的一个项目中需要物流追踪界面实现,我想到时候ListView来实现物流追踪界面。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50969789

目前我的一个项目中需要物流追踪界面实现,我想到时候ListView来实现物流追踪界面。下面我们先来看一下界面实现的效果:

这里写图片描述

该效果完全是使用ListView来实现了,下面我们来看一下是如何实现的

(一):布局ListView并编写Item布局

首先需要在布局上面编写ListView:

```
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.bobo.trace.MainActivity" >

<ListView 
    android:id="@+id/lv_trace"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
      android:divider="@drawable/trace_divider"
      android:dividerHeight="1dp"></ListView>

</RelativeLayout>

```

然后编写ListView的item布局:


    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout 
        android:id="@+id/rl_trace_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

         <View
            android:id="@+id/v_up_line"
            android:layout_width="2.5dp"
            android:layout_height="10dp"
            android:background="@color/mgrey"
            android:layout_marginLeft="22dp"></View>

        <ImageView 
            android:id="@+id/iv_state"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:src="@drawable/circle"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="15dp"/>

        <TextView 
            android:id="@+id/tv_trace_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@id/iv_state"
            android:layout_marginLeft="20dp"
            android:text="@string/test_trace_info"
            android:textColor="@android:color/black"
            android:textSize="13sp"/>

        <LinearLayout 
            android:id="@+id/ll_trace_phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="3dp"
            android:layout_toRightOf="@id/iv_state"
            android:layout_marginLeft="20dp"
            android:orientation="horizontal"
            android:layout_below="@id/tv_trace_info">

           <TextView 
            android:id="@+id/tv_phone_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/phone_label"
            android:textColor="@android:color/black"
            android:textSize="13sp"/>

            <TextView 
            android:id="@+id/tv_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="@string/test_phone"
            android:textColor="@android:color/black"
            android:textSize="13sp"/>

        </LinearLayout>

        <TextView 
            android:id="@+id/tv_trace_time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="3dp"
            android:layout_toRightOf="@id/iv_state"
            android:layout_marginLeft="20dp"
            android:text="@string/test_trace_info"
            android:textColor="@android:color/black"
            android:textSize="13sp"
            android:layout_below="@id/ll_trace_phone"/>



    <View
            android:id="@+id/v_down_line"
            android:layout_width="2.5dp"
            android:layout_height="45dp"
            android:background="@color/mgrey"
            android:layout_below="@id/iv_state"
            android:layout_marginLeft="22dp"></View>
    </RelativeLayout>

</RelativeLayout>

下面我们来看一下item效果:

这里写图片描述

在上面的效果图中,我们就可以看出,在这个item布局中,左边是”线-图片-线“的布局,显示一个时间轴,右边显示相应的信息,包括物流信息,联系电话和时间;我们知道,在时间轴中,第一个点是不需要上面那个线的,最后一个点是不需要下面那个线的,所以,这个的处理就需要我们在Adapter中进行相应的处理。

(二):自定义Adapter

下面我们就需要自定义Adapter来填充数据和进行View处理。

当然,在编写Adapter之前,我们需要一个javabean来保存相应的信息。

Trace.java:


    package com.bobo.beans;

    public class Trace {

    private boolean isHead;
    private String info;
    private String phone;
    private String time;

    public Trace(boolean isHead, String info, String phone, String time) {
        super();
        this.isHead = isHead;
        this.info = info;
        this.phone = phone;
        this.time = time;
    }

    public boolean isHead() {
        return isHead;
    }

    public void setHead(boolean isHead) {
        this.isHead = isHead;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }


}

下面我们就可以愉快的编写Adapter类了:


    package com.bobo.adapters;

    import java.util.ArrayList;

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

    import com.bobo.beans.Trace;
    import com.bobo.trace.R;

    public class TraceAdapter extends BaseAdapter {

    private ArrayList<Trace> tradeLists = null;
    private LayoutInflater inflater;
    private Context context;


    public TraceAdapter(ArrayList<Trace> tradeLists,Context context){
        this.tradeLists = tradeLists;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return tradeLists == null ? 0 : tradeLists.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return tradeLists.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) {
        Holder holder;

        if(convertView == null){
            convertView = inflater.inflate(R.layout.trace_item, null);
            holder = new Holder();

            holder.v_up_line = (View)convertView.findViewById(R.id.v_up_line);
            holder.iv_state = (ImageView)convertView.findViewById(R.id.iv_state);
            holder.tv_trace_info = (TextView)convertView.findViewById(R.id.tv_trace_info);
            holder.ll_trace_phone = (LinearLayout)convertView.findViewById(R.id.ll_trace_phone);
            holder.tv_phone = (TextView)convertView.findViewById(R.id.tv_phone);
            holder.tv_trace_time = (TextView)convertView.findViewById(R.id.tv_trace_time);
            holder.v_down_line = (View)convertView.findViewById(R.id.v_down_line);

            convertView.setTag(holder);
        }else{
            holder = (Holder)convertView.getTag();
        }

        if(tradeLists.get(position).isHead()){
            holder.v_up_line.setVisibility(View.GONE);
            //holder.iv_state = (ImageView)convertView.findViewById(R.id.iv_state);
            holder.tv_trace_info.setText(tradeLists.get(position).getInfo());

            holder.tv_phone.setText(tradeLists.get(position).getPhone());
            holder.tv_trace_time.setText(tradeLists.get(position).getTime());
            holder.v_down_line.setVisibility(View.VISIBLE);
        }else if(tradeLists.size() == (position+1)){
            holder.tv_trace_info.setText(tradeLists.get(position).getInfo());
            holder.ll_trace_phone.setVisibility(View.GONE);
            holder.tv_trace_time.setText(tradeLists.get(position).getTime());
            holder.v_down_line.setVisibility(View.GONE);
        }else{
            holder.tv_trace_info.setText(tradeLists.get(position).getInfo());
            holder.ll_trace_phone.setVisibility(View.GONE);
            holder.tv_trace_time.setText(tradeLists.get(position).getTime());
            holder.v_down_line.setVisibility(View.VISIBLE);
        }


        return convertView;
    }

    class Holder{
        View v_up_line;
        ImageView iv_state;
        TextView tv_trace_info;
        LinearLayout ll_trace_phone;
        TextView tv_phone;
        TextView tv_trace_time;
        View v_down_line;
    }

}

这样,我们的Adapter就已经适配完成,下面我们在Activity中实验一下。

(三):Activity实验:


    package com.bobo.trace;

    import java.util.ArrayList;

    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.widget.ListView;

    import com.bobo.adapters.TraceAdapter;
    import com.bobo.beans.Trace;


    public class MainActivity extends Activity {

    private ListView lv_trace;
    private ArrayList<Trace> tradeLists = new ArrayList<Trace>();
    private TraceAdapter ta;

    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = MainActivity.this;

        initView();

    }

    private void initView(){
        lv_trace = (ListView)findViewById(R.id.lv_trace);
        initData();

        ta = new TraceAdapter(tradeLists, context);
        lv_trace.setAdapter(ta);
    }

    private void initData(){

        tradeLists.add(new Trace(true, "商家已从广东发货", "15253157943", "2016-03-16 13:30:43"));
        tradeLists.add(new Trace(false, "货物正在配送", "", "2016-03-16 18:30:43"));
        tradeLists.add(new Trace(false, "货物已到达天津转运中心", "", "2016-03-17 13:30:43"));
        tradeLists.add(new Trace(false, "货品已到济南货运站", "", "2016-03-18 13:30:43"));
        tradeLists.add(new Trace(false, "货物已送达济南高新区站点", "", "2016-03-19 13:30:43"));
    }
}

这样运行之后,我们就会发现,ListView的selector宽度是占满全屏的,这样,我们就需要编写一个inset来调整ListView的selector。

trace_divider.xml:


    <?xml version="1.0" encoding="utf-8"?>
    <inset xmlns:android="http://schemas.android.com/apk/res/android" 
         android:insetLeft="50dp"
         android:drawable="@color/mgrey">


    </inset>

这样,我们的物流追踪界面就算是完成了,很简单。

目录
相关文章
|
6月前
|
监控 安全 算法
uwb人员定位系统:人员轨迹实时定位
vuwb人员定位系统:人员轨迹实时定位
324 0
uwb人员定位系统:人员轨迹实时定位
|
5月前
|
存储 前端开发 Java
实现实时追踪的返利App系统设计
实现实时追踪的返利App系统设计
|
6月前
|
监控 安全 5G
UWB人员精准定位系统源码,实现实时定位、人机料配对、物料标签配置、智慧调度、轨迹追踪
人员定位管理系统通过在厂区、车间部署UWB定位基站,实时采集人员、机具、物料上定位标签回传的位置信息数据,采用多维定位模式,精确定位人、机具、物料的实时位置,实现实时定位、人机料配对、物料标签配置、智慧调度、轨迹追踪、工时统计、区域物料统计、电子围栏等应用功能。
121 1
|
6月前
|
小程序 安全
手机扫一扫即可上报隐患、实时更新整改进度
可以在草料上搭建隐患上报系统,员工扫码即可上报隐患线索,管理人员可实时收到消息提醒,安排对应责任人进行整改。此外,可以在二维码中对隐患问题进行拍照、视频记录,从而体现问题整改前后的对比,确认整改效果。
|
安全 数据挖掘 BI
医疗安全(不良)事件管理系统源码 不良事件上报系统
医疗安全(不良)事件管理系统,主要包括对上报事件的保存、审批、修改及基本事件的统计分析等功能。 随着对患者安全关注度的逐渐提高,对于医院可能存在的各类不良事件进行上报和处理,对数据进行统计和分析,完成对事件的持续改进和整体风险评估,有效预防不良事件再次发生。 医疗安全(不良)事件管理,让上报者更加准确、快捷的将不良事件内容报告给相关管理人员,使管理者系统地收集资料,并通过深入分析和学习,寻找管理中的薄弱环节,完善系统结构,最终有效预防不良事件再次发生。
142 0
|
XML Java Android开发
Android8.1 开关VOLTE流程分析
Android8.1 开关VOLTE流程分析
535 0
Android8.1 开关VOLTE流程分析
|
安全 BI
不良事件上报系统源码,医院不良事件管理系统源码
技术架构:前后端分离,仓储模式,BS架构,有演示,已在多家医院完美运营。 相关技术:PHP+vscode+vue2+element+laravel8+mysql5.7 覆盖了医院内部所有不良事件种类的上报,包括医疗、药品、护理、设备、院感、输血、医技、安保后勤、信息等。同时是对各类医院安全不良事件进行分类统计,系统采用大量的预设项,提升报告效率。实现对不良事件的有效监营和控制。
287 0
不良事件上报系统源码,医院不良事件管理系统源码
|
安全 前端开发 数据挖掘
不良事件上报系统源码,多维度多样式的统计分析图表
商业级源码。不良事件上报系统是医疗机构自愿报告医疗安全不良事件的信息平台,具有非具名、非惩罚性质。管理员可通过对上报信息的研究分析,向医疗机构提出医疗安全警示和改进建议,以增强医院识别、处理安全隐患和预防不良事件发生的能力,从而实现安全医疗的目标。
154 0
不良事件上报系统源码,多维度多样式的统计分析图表
|
安全 前端开发 PHP
医院不良事件上报系统源码 ,通过鱼骨图方法进行原因溯源
技术架构:前后端分离,仓储模式 开发语言:PHP 开发工具:vscode 前端框架:vue2+element 后端框架:laravel8 数 据 库:mysql5.7 填报内容可量化、原因分析可量化,报告内容丰富,报告要素齐全,预设项详尽
333 0
|
Java 数据库 Android开发
Android MTK平台 客制化系统来电界面(屏蔽 InCallUI 提供接口给客户自行展示来电去电页面)
Android MTK平台 客制化系统来电界面(屏蔽 InCallUI 提供接口给客户自行展示来电去电页面)
275 0