Android自定义时间轴的实现

来源:互联网 发布:阿萨辛捏脸数据 编辑:程序博客网 时间:2024/05/27 21:49

时间轴

时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验。京东和淘宝的物流顺序就是一个时间轴(如图),想必大家都不陌生。


时间轴的初探

初次见到这种UI,感觉整个布局似曾相识,但面对那条时间轴却又不知如何下手。其实,整个时间轴还是可以当做一个ListView处理,只是在Adapter中的布局要花点心思。好了,废话不说,看代码。

整个效果就是一个ListView,ListView的每个条目的布局如下

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="#ffffff"  
  6.     android:orientation="vertical">  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/image"  
  10.         android:layout_width="15dp"  
  11.         android:layout_height="15dp"  
  12.         android:layout_marginLeft="85dp"  
  13.         android:src="@drawable/point2" />  
  14.   
  15.     <View  
  16.         android:id="@+id/line_normal"  
  17.         android:layout_width="3dp"  
  18.         android:layout_height="100dp"  
  19.         android:layout_below="@+id/image"  
  20.         android:layout_marginLeft="91dp"  
  21.         android:background="@color/colorAccent" />  
  22.   
  23.     <TextView  
  24.         android:id="@+id/show_title"  
  25.         android:layout_width="wrap_content"  
  26.         android:layout_height="wrap_content"  
  27.         android:layout_margin="3dp"  
  28.         android:layout_toLeftOf="@id/image"  
  29.         android:padding="3dp"       
  30.         android:textSize="12dp" />  
  31.   
  32.     <TextView  
  33.         android:id="@+id/show_time"  
  34.         android:layout_width="wrap_content"  
  35.         android:layout_height="wrap_content"  
  36.         android:layout_margin="5dp"  
  37.         android:layout_toRightOf="@id/image"  
  38.         android:padding="3dp"      
  39.         android:textSize="12dp" />  
  40.   
  41. </RelativeLayout>  

Adapter中的getView方法

[java] view plain copy
  1. @Override  
  2.     public View getView(int position, View convertView, ViewGroup parent) {  
  3.         // TODO Auto-generated method stub  
  4.         Holder holder;  
  5.         if (convertView == null) {  
  6.             holder= new Holder();  
  7.             convertView = LayoutInflater.from(mContext).inflate(R.layout.item_view, null);  
  8.             holder.time = (TextView) convertView.findViewById(R.id.show_time);  
  9.             holder.title= (TextView) convertView.findViewById(R.id.show_title);  
  10.             holder.line = convertView.findViewById(R.id.line_normal);  
  11.         } else {  
  12.             holder= (Holder) convertView.getTag();  
  13.         }  
  14.   
  15.         holder.time.setText(datas.get(position).getTime());  
  16.         holder.title.setText(datas.get(position).getTitle());  
  17.   
  18.         //最后一项时,竖线不再显示  
  19.         if (position == datas.size() - 1) {  
  20.             item.line.setVisibility(View.GONE);  
  21.         }  
  22.   
  23.         return convertView;  
  24.     }  
  25.   
  26.     private class Holder{  
  27.         TextView time, title;  
  28.         View line;  
  29.     }  

时间轴之--横向时间轴

上述的时间轴实现起来是比较容易的,就不再多说。这里想说一下的是横向的时间轴,京东和淘宝订单未结束时的物流状态就是一个横向的时间轴(类似于下图)

[java] view plain copy
  1. private Context mContext;  
  2.     //一个横向的ListView  
  3.     private HorizontalListView listview;  
  4.     private TimeLineAdapter2 adapter;  
  5.     List<ItemBean> datas = new ArrayList<ItemBean>();  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.         mContext = this;  
  12.         setContentView(R.layout.activity_time_line2);  
  13.         InitDatas();  
  14.         listview = (HorizontalListView) findViewById(R.id.list);  
  15.         adapter = new TimeLineAdapter2(mContext, datas);  
  16.         listview.setAdapter(adapter);  
  17.     }  
  18.   
  19.     /** 
  20.      * 这里用虚拟数据实现,仅供参考 
  21.      */  
  22.     private void InitDatas() {  
  23.         // TODO Auto-generated method stub  
  24.         ItemBean item1 = new ItemBean();  
  25.         item1.setTitle("提交订单");  
  26.         item1.setTime("03-14 08:13");  
  27.         item1.setStatu(1);  
  28.         ItemBean item2 = new ItemBean();  
  29.         item2.setTitle("已支付");  
  30.         item2.setTime("03-14 22:32");  
  31.         item2.setStatu(1);  
  32.         ItemBean item3 = new ItemBean();  
  33.         item3.setTitle("商品出库");  
  34.         item3.setTime("03-15 00:33");  
  35.         item3.setStatu(0);  
  36.         ItemBean item4 = new ItemBean();  
  37.         item4.setTitle("已签收");  
  38.         item4.setTime("03-15 15:55");  
  39.         item4.setStatu(0);  
  40.   
  41.         datas.add(item1);  
  42.         datas.add(item2);  
  43.         datas.add(item3);  
  44.         datas.add(item4);  
  45.     }  
横向ListView的条目布局:

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content" >  
  5.   
  6.     <TextView  
  7.         android:layout_alignRight="@id/image"  
  8.         android:id="@+id/show_title"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:padding="5dp"  
  12.         android:textSize="12dp" />  
  13.   
  14.     <TextView  
  15.         android:layout_alignRight="@id/image"  
  16.         android:visibility="invisible"  
  17.         android:id="@+id/show_time"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_below="@id/image"  
  21.         android:padding="5dp"  
  22.         android:textSize="12dp" />  
  23.   
  24.     <View  
  25.         android:id="@+id/line_normal"  
  26.         android:layout_width="100dp"  
  27.         android:layout_height="3dp"  
  28.         android:layout_centerVertical="true"  
  29.         android:background="#A6A6A6" />  
  30.     <View  
  31.         android:visibility="gone"  
  32.         android:id="@+id/line_highlight"  
  33.         android:layout_width="100dp"  
  34.         android:layout_height="3dp"  
  35.         android:layout_centerVertical="true"  
  36.         android:background="@color/colorAccent" />  
  37.   
  38.     <ImageView  
  39.         android:layout_toRightOf="@id/line_normal"  
  40.         android:id="@+id/image"  
  41.         android:layout_width="15dp"  
  42.         android:layout_height="15dp"  
  43.         android:layout_below="@id/show_title"  
  44.         android:src="@drawable/point2" />  
  45.   
  46. </RelativeLayout>  

Adapter的代码实现:

[java] view plain copy
  1. @Override  
  2.     public View getView(int position, View convertView, ViewGroup parent) {  
  3.         // TODO Auto-generated method stub  
  4.         Holder holder;  
  5.         if (convertView == null) {  
  6.             holder= new Holder();  
  7.             convertView = LayoutInflater.from(mContext).inflate(R.layout.item_view2, null);  
  8.             holder.time = (TextView) convertView.findViewById(R.id.show_time);  
  9.             holder.title = (TextView) convertView.findViewById(R.id.show_title);  
  10.             holder.lineNorma = convertView.findViewById(R.id.line_normal);  
  11.             holder.lineHiLight = convertView.findViewById(R.id.line_highlight);  
  12.             holder.image = (ImageView) convertView.findViewById(R.id.image);  
  13.         } else {  
  14.             holder= (Holder) convertView.getTag();  
  15.         }  
  16.   
  17.   
  18.         //根据数据状态对视图做不同的操作  
  19.         if (datas.get(position).getStatu() == 1) {  
  20.             holder.lineHiLight.setVisibility(View.VISIBLE);  
  21.             holder.image.setImageResource(R.drawable.point1);  
  22.             holder.time.setVisibility(View.VISIBLE);  
  23.         }  
  24.   
  25.         holder.time.setText(datas.get(position).getTime());  
  26.         holder.title.setText(datas.get(position).getTitle());  
  27.   
  28.   
  29.         //这里在起始位置,就不显示“轴”了  
  30.         if (position == 0) {  
  31.             holder.lineNorma.setVisibility(View.INVISIBLE);  
  32.             holder.lineHiLight.setVisibility(View.INVISIBLE);  
  33.         }  
  34.   
  35.         return convertView;  
  36.     }  
  37.   
  38.     private class Holder{  
  39.         TextView time, title;  
  40.         View lineNorma, lineHiLight;  
  41.         ImageView image;  
  42.     }  

当然实际开发中的处理会更复杂一点,这里只是提供了一个这样的思路,其实思路也是我从网上看的,嘿嘿,不过我感觉这个思路也可用到一些页面的Indicator上面,效果是一样的,

当然也可以结合google推出的RecycleView来使用,那样的话就不用管是水平还是竖直了,做技术最重要的就是思想了,希望这篇文章能给大家一个好的思路

2 0
原创粉丝点击