Android时间轴效果的实现

来源:互联网 发布:软件定制价格 编辑:程序博客网 时间:2024/05/18 02:56
最近项目需要用到时间轴的效果,网上看了几个例子,和想要实现的效果也不尽相同,下面将我的实现方法和思路说一下。首先看下效果图:

Android时间轴效果的实现 - shexinyang - 神话

数据是随便填的,显得有点乱,但是不影响效果。实现方面主要是用ListView来实现,主要是根据ListView的item位置与上一条数据进行比较,来控制时间的显示隐藏效果。思路很简单,下面看代码实现:
首先是页面的整体布局,很简单,就一个ListView:
res/layout/activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical" >

  6.     <ListView
  7.         android:id="@+id/lv_list"
  8.         android:layout_width="match_parent"
  9.         android:layout_height="wrap_content"
  10.         android:cacheColorHint="@null"
  11.         android:divider="@null" >
  12.     </ListView>

  13. </LinearLayout>
复制代码


ListView的item的布局分了三部分,一个需要显示隐藏的标题栏,包括一个小圆点和一个显示时间的TextView,第二部分是展示的内容,最后是时间轴的竖线。
res/layout/item_time_line.xml
  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.     <RelativeLayout
  6.         android:id="@+id/rl_title"
  7.         android:layout_width="match_parent"
  8.         android:layout_height="wrap_content"
  9.         android:paddingTop="10dp" >

  10.         <ImageView
  11.             android:layout_width="wrap_content"
  12.             android:layout_height="wrap_content"
  13.             android:layout_centerVertical="true"
  14.             android:layout_marginLeft="8dp"
  15.             android:background="@drawable/img_line_point" />

  16.         <TextView
  17.             android:id="@+id/txt_date_time"
  18.             android:layout_width="wrap_content"
  19.             android:layout_height="wrap_content"
  20.             android:layout_centerVertical="true"
  21.             android:layout_marginLeft="15dp"
  22.             android:textColor="#FC6802" />
  23.     </RelativeLayout>

  24.     <TextView
  25.         android:id="@+id/txt_date_content"
  26.         android:layout_width="wrap_content"
  27.         android:layout_height="wrap_content"
  28.         android:layout_below="@id/rl_title"
  29.         android:layout_marginLeft="15dp"
  30.         android:paddingBottom="10dp"
  31.         android:textColor="#5296C5" />

  32.     <View
  33.         android:id="@+id/v_line"
  34.         android:layout_width="2dp"
  35.         android:layout_height="wrap_content"
  36.         android:layout_marginLeft="10dp"
  37.         android:background="#FC6802" />

  38. </RelativeLayout>
复制代码

下面看主要的实现部分,是在listview的适配器中:
DateAdapter.java
  1. package com.xiaowu.timeline;

  2. import java.util.List;

  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.RelativeLayout;
  9. import android.widget.RelativeLayout.LayoutParams;
  10. import android.widget.TextView;

  11. public class DateAdapter extends BaseAdapter {
  12.         private Context context;
  13.         private List<DateText> list;

  14.         public DateAdapter(Context context, List<DateText> list) {
  15.                 this.context = context;
  16.                 this.list = list;
  17.         }

  18.         @Override
  19.         public int getCount() {
  20.                 if (list == null) {
  21.                         return 0;
  22.                 }
  23.                 return list.size();
  24.         }

  25.         @Override
  26.         public Object getItem(int position) {
  27.                 if (list == null) {
  28.                         return null;
  29.                 }
  30.                 return list.get(position);
  31.         }

  32.         @Override
  33.         public long getItemId(int position) {
  34.                 return position;
  35.         }

  36.         @Override
  37.         public View getView(int position, View convertView, ViewGroup parent) {
  38.                 ViewHolder holder = null;
  39.                 if (convertView == null) {
  40.                         holder = new ViewHolder();
  41.                         convertView = LayoutInflater.from(context).inflate(
  42.                                         R.layout.item_time_line, parent, false);
  43.                         holder.date = (TextView) convertView
  44.                                         .findViewById(R.id.txt_date_time);
  45.                         holder.content = (TextView) convertView
  46.                                         .findViewById(R.id.txt_date_content);
  47.                         holder.line = (View) convertView.findViewById(R.id.v_line);
  48.                         holder.title = (RelativeLayout) convertView
  49.                                         .findViewById(R.id.rl_title);
  50.                         convertView.setTag(holder);
  51.                 } else {
  52.                         holder = (ViewHolder) convertView.getTag();
  53.                 }
  54.                 //时间轴竖线的layout
  55.                 LayoutParams params = (LayoutParams) holder.line.getLayoutParams();
  56.                 //第一条数据,肯定显示时间标题
  57.                 if (position == 0) {
  58.                         holder.title.setVisibility(View.VISIBLE);
  59.                         holder.date.setText(TimeFormat.format("yyyy.MM.dd",
  60.                                         list.get(position).getDate()));
  61.                         params.addRule(RelativeLayout.ALIGN_TOP, R.id.rl_title);
  62.                         params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.txt_date_content);
  63.                 } else { // 不是第一条数据
  64.                         // 本条数据和上一条数据的时间戳相同,时间标题不显示
  65.                         if (list.get(position).getDate()
  66.                                         .equals(list.get(position - 1).getDate())) {
  67.                                 holder.title.setVisibility(View.GONE);
  68.                                 params.addRule(RelativeLayout.ALIGN_TOP, R.id.txt_date_content);
  69.                                 params.addRule(RelativeLayout.ALIGN_BOTTOM,
  70.                                                 R.id.txt_date_content);
  71.                         } else {
  72.                                 //本条数据和上一条的数据的时间戳不同的时候,显示数据
  73.                                 holder.title.setVisibility(View.VISIBLE);
  74.                                 holder.date.setText(TimeFormat.format("yyyy.MM.dd",
  75.                                                 list.get(position).getDate()));
  76.                                 params.addRule(RelativeLayout.ALIGN_TOP, R.id.rl_title);
  77.                                 params.addRule(RelativeLayout.ALIGN_BOTTOM,
  78.                                                 R.id.txt_date_content);
  79.                         }
  80.                 }
  81.                 holder.line.setLayoutParams(params);
  82.                 holder.content.setText(list.get(position).getText());
  83.                 return convertView;
  84.         }

  85.         public static class ViewHolder {
  86.                 RelativeLayout title;
  87.                 View line;
  88.                 TextView date;
  89.                 TextView content;
  90.         }
  91. }

复制代码
其中DateText是实体类,包括标题和内容:

DateText.java
  1. package com.xiaowu.timeline;

  2. public class DateText {
  3.         private String date;
  4.         private String text;

  5.         public DateText() {

  6.         }

  7.         public DateText(String date, String text) {
  8.                 super();
  9.                 this.date = date;
  10.                 this.text = text;
  11.         }

  12.         public String getDate() {
  13.                 return date;
  14.         }

  15.         public void setDate(String date) {
  16.                 this.date = date;
  17.         }

  18.         public String getText() {
  19.                 return text;
  20.         }

  21.         public void setText(String text) {
  22.                 this.text = text;
  23.         }

  24. }

复制代码
adapter里面用到了一个时间戳转为指定格式的工具类:
TimeFormat.java
  1. package com.xiaowu.timeline;

  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;

  5. public class TimeFormat {
  6.         public static String format(String format, String time) {
  7.                 String result = "";
  8.                 SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
  9.                 try {
  10.                         Date date = df.parse(time);
  11.                         SimpleDateFormat df1 = new SimpleDateFormat(format);
  12.                         result = df1.format(date);
  13.                 } catch (ParseException e) {
  14.                         e.printStackTrace();
  15.                 }
  16.                 return result;
  17.         }
  18. }

复制代码
场景类中还用到一个比较时间戳的工具类:

DateComparator.java
  1. package com.xiaowu.timeline;

  2. import java.util.Comparator;

  3. public class DateComparator implements Comparator<DateText> {

  4.         @Override
  5.         public int compare(DateText lhs, DateText rhs) {
  6.                 return rhs.getDate().compareTo(lhs.getDate());
  7.         }

  8. }

复制代码
下面看下场景类:

MainActivity.java
  1. package com.xiaowu.timeline;

  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;

  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.widget.ListView;

  8. public class MainActivity extends Activity {
  9.         // 时间轴列表
  10.         private ListView lvList;
  11.         // 数据list
  12.         private List<DateText> list;
  13.         // 列表适配器
  14.         private DateAdapter adapter;

  15.         @Override
  16.         protected void onCreate(Bundle savedInstanceState) {
  17.                 super.onCreate(savedInstanceState);
  18.                 setContentView(R.layout.activity_main);
  19.                 // findviewbyid
  20.                 lvList = (ListView) findViewById(R.id.lv_list);
  21.                 list = new ArrayList<DateText>();
  22.                 // 添加测试数据
  23.                 addData();
  24.                 // 将数据按照时间排序
  25.                 DateComparator comparator = new DateComparator();
  26.                 Collections.sort(list, comparator);
  27.                 // listview绑定适配器
  28.                 adapter = new DateAdapter(this, list);
  29.                 lvList.setAdapter(adapter);
  30.         }

  31.         private void addData() {
  32.                 DateText date1 = new DateText("20140710", "撒大声地");
  33.                 DateText date2 = new DateText("20140709", "撒萨达");
  34.                 DateText date3 = new DateText("20140726", "撒大ADS");
  35.                 DateText date4 = new DateText("20140710", "撒达到对萨达撒地");
  36.                 DateText date5 = new DateText("20140711", "撒大阿瑟的萨达地");
  37.                 DateText date6 = new DateText("20140713", "撒撒大大地");
  38.                 DateText date7 = new DateText("20140712", "撒大鼎折覆餗地");
  39.                 DateText date8 = new DateText("20140714", "撒大请问阿尔阿斯顿");
  40.                 DateText date9 = new DateText("20140709", "撒大亲爱额问问乔恩地");
  41.                 DateText date10 = new DateText("20140705", "撒 请问请问地");
  42.                 DateText date11 = new DateText("20140729", "撒请问额外确认声地");
  43.                 DateText date12 = new DateText("20140725", "撒大按时打算");
  44.                 DateText date13 = new DateText("20140716", "撒大爱上大声地");
  45.                 DateText date14 = new DateText("20140711", "撒其味无穷地");
  46.                 DateText date15 = new DateText("20140710", "撒大请问我期待地");
  47.                 DateText date16 = new DateText("20140711", "撒大声萨达");
  48.                 DateText date17 = new DateText("20140712", "阿斯达");
  49.                 DateText date18 = new DateText("20140711", "撒大声大声道");
  50.                 DateText date19 = new DateText("20140715", "阿斯顿撒打算23 ");
  51.                 DateText date20 = new DateText("20140723", "范德萨发生");
  52.                 DateText date21 = new DateText("20140718", "阿萨德飞洒");
  53.                 DateText date22 = new DateText("20140706", "撒打算打算");
  54.                 DateText date23 = new DateText("20140714", "撒打算");
  55.                 DateText date24 = new DateText("20140726", "轻微的城市的方式");
  56.                 DateText date25 = new DateText("20140725", "阿斯达阿斯达现在");
  57.                 DateText date26 = new DateText("20140723", "代购费多少自行车");
  58.                 DateText date27 = new DateText("20140721", "多撒阿萨德时打算");
  59.                 DateText date28 = new DateText("20140716", "爱上大声地啊地");
  60.                 DateText date29 = new DateText("20140712", "阿斯蒂芬当我师傅");
  61.                 DateText date30 = new DateText("20140710", "撒大声大声道");
  62.                 list.add(date1);
  63.                 list.add(date2);
  64.                 list.add(date3);
  65.                 list.add(date4);
  66.                 list.add(date5);
  67.                 list.add(date6);
  68.                 list.add(date7);
  69.                 list.add(date8);
  70.                 list.add(date9);
  71.                 list.add(date10);
  72.                 list.add(date11);
  73.                 list.add(date12);
  74.                 list.add(date13);
  75.                 list.add(date14);
  76.                 list.add(date15);
  77.                 list.add(date16);
  78.                 list.add(date17);
  79.                 list.add(date18);
  80.                 list.add(date19);
  81.                 list.add(date20);
  82.                 list.add(date21);
  83.                 list.add(date22);
  84.                 list.add(date23);
  85.                 list.add(date24);
  86.                 list.add(date25);
  87.                 list.add(date26);
  88.                 list.add(date27);
  89.                 list.add(date28);
  90.                 list.add(date29);
  91.                 list.add(date30);
  92.         }
  93. }

复制代码
附上代码: 
游客,如果您要查看本帖隐藏内容请回复

另,我在github也发现了一个不错的时间轴项目:
https://github.com/razerdp/UnderLineLinearLayout

0 0
原创粉丝点击