在许多App上都能看到时光轴的效果,比如携程等等,那么我们今天就利用ExpandableListView来实现一个时光轴效果,先来看看效果图:


使用ExpandableListView实现一个时光轴_ide

效果还是挺简单的,这里我们主要是采用ExpandableListView来实现,关于ExpandableListView的详细使用参见(android开发之ExpandableListView的使用,实现类似QQ好友列表),我们这里主要介绍这个效果的实现:

先来看看主布局文件:




1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
2. "http://schemas.android.com/tools"  
3. "match_parent"  
4. "match_parent" >  
5.   
6.     <TextView  
7. "@+id/title_p"  
8. "wrap_content"  
9. "wrap_content"  
10. "true"  
11. "12dp"  
12. "center"  
13. "2015年11月"  
14. "18sp" />  
15.   
16.     <View  
17. "@+id/hor_div"  
18. "match_parent"  
19. "1dp"  
20. "@id/title_p"  
21. "#9F79EE" />  
22.   
23.     <View  
24. "@+id/ver_div"  
25. "1dp"  
26. "match_parent"  
27. "@id/hor_div"  
28. "70dp"  
29. "#9F79EE" />  
30.   
31.     <TextView  
32. "@+id/title_c"  
33. "match_parent"  
34. "wrap_content"  
35. "@id/hor_div"  
36. "60dp"  
37. "12dp"  
38. "18dp"  
39. "12dp"  
40. "时光轴"  
41. "24sp" />  
42.   
43.     <ExpandableListView  
44. "@+id/lv"  
45. "match_parent"  
46. "match_parent"  
47. "@id/title_c"  
48. "60dp"  
49. "@null"  
50. "false"  
51. "@null" >  
52.     </ExpandableListView>  
53.   
54. </RelativeLayout>


两条分割线用View来做,整体不难,不多说,看看MainActivity




    1. public class MainActivity extends Activity {  
    2.   
    3. private List<TimeLineBean> list;  
    4. private ExpandableListView lv;  
    5.   
    6. @Override  
    7. protected void onCreate(Bundle savedInstanceState) {  
    8. super.onCreate(savedInstanceState);  
    9.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
    10.         setContentView(R.layout.activity_main);  
    11.         initData();  
    12.         initView();  
    13.     }  
    14.   
    15. private void initView() {  
    16. this.findViewById(R.id.lv);  
    17. new MyAdapter(MainActivity.this, list));  
    18. for (int i = 0; i < list.size(); i++) {  
    19.             lv.expandGroup(i);  
    20.         }  
    21. null);  
    22. new OnGroupClickListener() {  
    23.   
    24. @Override  
    25. public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {  
    26. return true;  
    27.             }  
    28.         });  
    29.     }  
    30.   
    31. private void initData() {  
    32. new ArrayList<TimeLineBean>();  
    33. new ArrayList<String>();  
    34. "六王毕,四海一;");  
    35. "蜀山兀,阿房出。");  
    36. "覆压三百余里,隔离天日。");  
    37. new TimeLineBean("11月24日", things));  
    38. new ArrayList<String>();  
    39. "骊山北构而西折,");  
    40. "直走咸阳。");  
    41. "二川溶溶,流入宫墙。");  
    42. new TimeLineBean("11月23日", things));  
    43. new ArrayList<String>();  
    44. "五步一楼,十步一阁;");  
    45. "廊腰缦回,");  
    46. new TimeLineBean("11月22日", things));  
    47. new ArrayList<String>();  
    48. "檐牙高啄;");  
    49. "各抱地势,钩心斗角。");  
    50. "盘盘焉,囷囷焉,蜂房水涡,");  
    51. "矗不知乎几千万落!");  
    52. new TimeLineBean("11月21日", things));  
    53. new ArrayList<String>();  
    54. "长桥卧波,未云何龙?");  
    55. "複道行空,不霁何虹?");  
    56. "高低冥迷,不知西东。");  
    57. new TimeLineBean("11月20日", things));  
    58. new ArrayList<String>();  
    59. "歌台暖响,");  
    60. "春光融融;");  
    61. new TimeLineBean("11月19日", things));  
    62. new ArrayList<String>();  
    63. "舞殿冷袖,");  
    64. "风雨凄凄。");  
    65. "一日之内,一宫之间,");  
    66. "而气候不齐。");  
    67. new TimeLineBean("11月18日", things));  
    68.     }  
    69. }



    在MainActivity中我们先初始化模拟数据,然后初始化View,初始化View的过程中,通过一个for循环让所有的group展开,然后再屏蔽掉group的点击事件,好了,再来看看Adapter:




    1. public class MyAdapter extends BaseExpandableListAdapter {  
    2.   
    3. private Context context;  
    4. private List<TimeLineBean> list;  
    5.   
    6. public MyAdapter(Context context, List<TimeLineBean> list) {  
    7. this.context = context;  
    8. this.list = list;  
    9.     }  
    10.   
    11. @Override  
    12. public Object getChild(int groupPosition, int childPosition) {  
    13. return list.get(groupPosition).getThings();  
    14.     }  
    15.   
    16. @Override  
    17. public long getChildId(int groupPosition, int childPosition) {  
    18. return childPosition;  
    19.     }  
    20.   
    21. @Override  
    22. public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,  
    23.             ViewGroup parent) {  
    24. null;  
    25. if (convertView == null) {  
    26. null);  
    27. new ChildHolder();  
    28.             holder.tv = (TextView) convertView.findViewById(R.id.ci_thing);  
    29.             convertView.setTag(holder);  
    30. else {  
    31.             holder = (ChildHolder) convertView.getTag();  
    32.         }  
    33.         holder.tv.setText(list.get(groupPosition).getThings().get(childPosition));  
    34. return convertView;  
    35.     }  
    36.   
    37. @Override  
    38. public int getChildrenCount(int groupPosition) {  
    39. return list.get(groupPosition).getThings().size();  
    40.     }  
    41.   
    42. @Override  
    43. public Object getGroup(int groupPosition) {  
    44. return list.get(groupPosition).getDate();  
    45.     }  
    46.   
    47. @Override  
    48. public int getGroupCount() {  
    49. return list.size();  
    50.     }  
    51.   
    52. @Override  
    53. public long getGroupId(int groupPosition) {  
    54. return groupPosition;  
    55.     }  
    56.   
    57. @Override  
    58. public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {  
    59. null;  
    60. if (convertView == null) {  
    61. null);  
    62. new GroupHolder();  
    63.             holder.tv = (TextView) convertView.findViewById(R.id.gi_date);  
    64.             convertView.setTag(holder);  
    65. else {  
    66.             holder = (GroupHolder) convertView.getTag();  
    67.         }  
    68.         holder.tv.setText(list.get(groupPosition).getDate());  
    69. return convertView;  
    70.     }  
    71.   
    72. @Override  
    73. public boolean hasStableIds() {  
    74. return false;  
    75.     }  
    76.   
    77. @Override  
    78. public boolean isChildSelectable(int groupPosition, int childPosition) {  
    79. return false;  
    80.     }  
    81.   
    82. class GroupHolder {  
    83.         TextView tv;  
    84.     }  
    85.   
    86. class ChildHolder {  
    87.         TextView tv;  
    88.     }  
    89.   
    90. }

    这个Adapter也没啥讲的,大家如果有疑问可以参见 android开发之ExpandableListView的使用,实现类似QQ好友列表

    ,这里有ExpandableListView的详细介绍。最后就是两个item文件:

    group_item.xml




    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3. "match_parent"  
    4. "match_parent"  
    5. "horizontal" >  
    6.   
    7.     <View  
    8. "20dp"  
    9. "20dp"  
    10. "22dp"  
    11. "@drawable/circle" />  
    12.   
    13.     <TextView  
    14. "@+id/gi_date"  
    15. "match_parent"  
    16. "wrap_content"  
    17. "16dp"  
    18. "12dp"  
    19. "18dp"  
    20. "11月24号"  
    21. "22sp" />  
    22.   
    23. </LinearLayout>


    child_item.xml:




    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3. "match_parent"  
    4. "match_parent"  
    5. "vertical" >  
    6.   
    7.     <TextView  
    8. "@+id/ci_thing"  
    9. "match_parent"  
    10. "wrap_content"  
    11. "22dp"  
    12. "8dp"  
    13. "11月24号"  
    14. "#999999"  
    15. "16sp" />  
    16.   
    17. </LinearLayout>



    每个group_item的前面有一个红色的实心球,这个球我们用shape来绘制,关于shape的使用参见

    android开发之shape详解


    circle.xml




    好了,这个东西貌似没难度,其实就是ExpandableListView的使用。

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
    3. "oval" >  
    4.   
    5. "10dp" />  
    6.   
    7.     <size  
    8. "10dp"  
    9. "10dp" />  
    10.   
    11. "#FF6A6A" />  
    12.   
    13. </shape>