Android ListView物流获取追踪功能实现

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>

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

关于ListView物流获取追踪功能实现就给大家介绍到这里,希望对大家有所帮助!

(0)

相关推荐

  • Android仿淘宝物流信息TimeLineView

    淘宝物流信息TimeLine的制作方法: 仿照的TimeLine效果图: 代码实现: package com.zms.timelineview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import andro

  • Android时光轴实现淘宝物流信息浏览效果

    本文实例为大家分享了Android时光轴的制作方法,供大家参考,具体内容如下 1. 效果 2.分析和实现 2.1效果实现: 之前想了一下这种效果,因为只需要用到自己的项目中所以采用图片直接布局的形式去实现效果,虽然效果实现了,但是后来发现了出了很多问题:第一Android的分辨率太多了直接设置xxxdp难免有部分机型出现不适配的情况,第二我们与右边这部分需要对齐的问题这个就比较头大. 所以目前的实现效果方式是这样子的: 1.自定义TimerLineMarker,根据自定义属性获取点和线的背景资源

  • Android ListView物流获取追踪功能实现

    ListView 控件可使用四种不同视图显示项目.通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本. 最近在网上看到时间轴的布局效果,尝试按照这个原理,实现物流跟踪的效果,目前已经实现了,效果如下图 该效果完全是使用ListView来实现了,下面我们来看一下是如何实现的 (一):布局ListView并编写Item布局 首先需要在布局上面编写ListView: <RelativeLayout xmlns:android="http://schemas.android.c

  • Android ListView隐藏右侧滚动条功能

    关于ListView的滚动条几种情形: 1.默认情况:活动(滚动)时显示,不活动时隐藏. 2.活动和不活动时都显示. 3.活动和不活动时都隐藏. 上述集中情况,均有ListView的以下设置属性方法控制 1.setVerticalScrollBarEnabled(boolean b); 设置true时: 存在滚动条 设置false时: 隐藏滚动条 2.setScrollbarFadingEnabled(boolean b); 设置true时: 活动时显示滚动条,不活动时隐藏滚动条 设置false

  • Android ListView实现简单列表功能

    ListView如何实现简单列表,供大家参考,具体内容如下 效果图: 啥也没干的ListView张这样: fry.Activity01 package fry; import com.example.ListView.R; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.

  • Android ListView实现上拉加载更多和下拉刷新功能

    本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新 图片缓存 快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsLi

  • Android基于高德地图poi的仿微信获取位置功能实例代码

    1.打开页面自动定位,同时搜索周边所有poi 2.点击搜索按钮,输入关键子,获取关键字搜索结果 3.选取listview中的一项即可定位到该位置,或者获取任何消息 4.文件类 1.MapActivity public class MapActivity extends Activity implements PoiSearch.OnPoiSearchListener { private MapView mMapView = null; private AMap aMap; private MyL

  • Android ListView 子控件onClick正确获取position的方法

    在实际开发中,我们有时候不仅需要响应ListView的onItemClick,还需要响应其子控件的点击事件,这个时候我们就会 发现,由于复用等原因,如果直接在子控件的onClick事件中调用getView()中的position,会出现数据或显示错位的问 题,原因就是position的值出现了重复或不准确,解决这个问题的方法是,在adapter每次加载数据的时候,为需要点击 的控件设置一个tag值,这个tag值就设置为当前这个控件对应的position,然后在点击事件中gettag(),获取这个

  • android getActivity.findViewById获取ListView 返回NULL的方法

    在控件ID正确的情况下,检查是否在实例化布局文件之后,获取LISTVIEW, 先inflate找layout下布局文件,并实例化后才能获得Listview的ID demo: public class FragmentPage extends Fragment { View view = null; @Override @SuppressLint("HandlerLeak") public View onCreateView(LayoutInflater inflater, ViewGr

  • Android ListView实现单选及多选等功能示例

    本文实例讲述了Android ListView实现单选及多选等功能的方法.分享给大家供大家参考,具体如下: 在项目中也遇到过给ListView的item添加选择功能.比如一个网购APP,有个历史浏览页面,这个页面现点击item单选/多选及全选删除功能. 当时也是通过在数据中添加一个是否选择的字段来记录item的状态,然后根据这个字段有相应的position位置进行选择状态更改及删除操作. 刚刚看了Android API Demos中17种ListView的实现方法,发现ListView自身就带有

  • Android ListView用EditText实现搜索功能效果

    前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能.即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表.我把这个功能抽取出来了,先贴一下效果图: 分析 在查阅资料以后,发现其实Android中已经帮我们实现了这个功能,如果你的ListView使用的是系统的ArrayAdapter,那么恭喜你,下面的事情就很简单了,你只需要调用下面的代码就可以实现了: searchEdittext.addTextChangedListener(new TextWatche

  • Android 简单封装获取验证码倒计时功能

    效果如下图所示: 如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用 CountDownTimer 定时器简单封装下此效果,方便我们随时调用. 首页先在 attrs.xml 中定义下所需的几个属性: <resources> <declare-styleable name="CountDownButton"> <attr name="millisinfuture" format="integer&q

随机推荐