前几日看到了一个简单时光轴的实现源码,学习分享一下。
这个是用ExpandableListView来实现的,简单易懂。
效果如图:
下面来详细说明下实现步骤:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#f7f7f7" > <RelativeLayout android:id="@+id/date_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="10dp" android:paddingTop="10dp" > <TextView android:id="@+id/time_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="2015年12月1日" android:textColor="@android:color/black" /> </RelativeLayout> <View android:id="@+id/top_line" android:layout_width="match_parent" android:layout_height="1dp" android:layout_below="@id/date_layout" android:background="@color/head_line_bg" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/top_line" > <View android:id="@+id/group_tiao" android:layout_width="1dp" android:layout_height="fill_parent" android:layout_marginLeft="55dp" android:background="@color/time_line_bg" /> <TextView android:id="@+id/courses_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginLeft="70dp" android:layout_marginTop="10dp" android:text="时光轴" android:textColor="@android:color/black" android:textSize="22dp" /> <ExpandableListView android:id="@+id/expandlist" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/courses_title" android:cacheColorHint="#00000000" android:divider="@null" /> </RelativeLayout> </RelativeLayout>
其次是组和子对象的布局:
group_status_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" > <ImageView android:id="@+id/imageView1" android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="center_vertical" android:layout_marginLeft="45dp" android:layout_marginRight="5dp" android:background="@drawable/icons_ok" android:contentDescription="@string/app_name" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dip" android:layout_marginTop="20dp" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:id="@+id/one_status_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:textColor="#000000" android:textSize="18sp" /> </LinearLayout> </LinearLayout>
先创建数据类:
GroupStatusEntity
import java.util.List; /** * 一级Item实体类 * * @author zihao * */ public class GroupStatusEntity { private String groupName; /** 二级Item数据列表 **/ private List<ChildStatusEntity> childList; public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } public List<ChildStatusEntity> getChildList() { return childList; } public void setChildList(List<ChildStatusEntity> childList) { this.childList = childList; } }
/** * 二级Item实体类 * * @author zihao * */ public class ChildStatusEntity { /** 发生的事件 **/ private String completeTime; /** 是否已完成 通过这个可以修改文本颜色什么的 **/ private boolean isfinished; public String getCompleteTime() { return completeTime; } public void setCompleteTime(String completeTime) { this.completeTime = completeTime; } public boolean isIsfinished() { return isfinished; } public void setIsfinished(boolean isfinished) { this.isfinished = isfinished; } }
ExpandableListView 继承自ListView,所以步骤一样setAdapter
创建一个StatusExpandAdapter类,继承自BaseExpandableListAdapter并实现方法。
public class StatusExpandAdapter extends BaseExpandableListAdapter { private LayoutInflater inflater = null; private List<GroupStatusEntity> groupList; /** * 构造方法 * * @param context * @param oneList */ public StatusExpandAdapter(Context context, List<GroupStatusEntity> group_list) { this.groupList = group_list; inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } /** * 返回一级Item总数 */ @Override public int getGroupCount() { // TODO Auto-generated method stub return groupList.size(); } /** * 返回二级Item总数 */ @Override public int getChildrenCount(int groupPosition) { if (groupList.get(groupPosition).getChildList() == null) { return 0; } else { return groupList.get(groupPosition).getChildList().size(); } } /** * 获取一级Item内容 */ @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return groupList.get(groupPosition); } /** * 获取二级Item内容 */ @Override public Object getChild(int groupPosition, int childPosition) { return groupList.get(groupPosition).getChildList().get(childPosition); } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder holder = new GroupViewHolder(); if (convertView == null) { convertView = inflater.inflate(R.layout.group_status_item, null); } holder.groupName = (TextView) convertView .findViewById(R.id.one_status_name); holder.groupName.setText(groupList.get(groupPosition).getGroupName()); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder viewHolder = null; ChildStatusEntity entity = (ChildStatusEntity) getChild(groupPosition, childPosition); if (convertView != null) { viewHolder = (ChildViewHolder) convertView.getTag(); } else { viewHolder = new ChildViewHolder(); convertView = inflater.inflate(R.layout.child_status_item, null); viewHolder.twoStatusTime = (TextView) convertView .findViewById(R.id.two_complete_time); } viewHolder.twoStatusTime.setText(entity.getCompleteTime()); convertView.setTag(viewHolder); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return false; } private class GroupViewHolder { TextView groupName; } private class ChildViewHolder { public TextView twoStatusTime; } }
最后就是在MainActivity中添加数据了。
public class MainActivity extends Activity { private ExpandableListView expandlistView; private StatusExpandAdapter statusAdapter; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; expandlistView = (ExpandableListView) findViewById(R.id.expandlist); initExpandListView(); } /** * 初始化可拓展列表 */ private void initExpandListView() { statusAdapter = new StatusExpandAdapter(context, getListData()); expandlistView.setAdapter(statusAdapter); expandlistView.setGroupIndicator(null); // 去掉默认带的箭头 expandlistView.setSelection(0);// 设置默认选中项 // 遍历所有group,将所有项设置成默认展开 int groupCount = expandlistView.getCount(); for (int i = 0; i < groupCount; i++) { expandlistView.expandGroup(i); } expandlistView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // TODO Auto-generated method stub expandlistView.collapseGroup(groupPosition);//关闭 return false; } }); } @Override public void onBackPressed() { //暂停应用,保存当前Activity的状态 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); } private List<GroupStatusEntity> getListData() { List<GroupStatusEntity> groupList; String[] strArray = new String[] { "10月22日", "10月23日", "10月25日" }; String[][] childTimeArray = new String[][] { { "俯卧撑十次", "仰卧起坐二十次", "浏览CSDN", "刷OJ水题" }, { "卖肉松饼","上单天使","么么哒" }, { "睡觉~","爱生活~","仰卧起坐二十次","水电费" } }; groupList = new ArrayList<GroupStatusEntity>(); for (int i = 0; i < strArray.length; i++) { GroupStatusEntity groupStatusEntity = new GroupStatusEntity(); groupStatusEntity.setGroupName(strArray[i]); List<ChildStatusEntity> childList = new ArrayList<ChildStatusEntity>(); for (int j = 0; j < childTimeArray[i].length; j++) { ChildStatusEntity childStatusEntity = new ChildStatusEntity(); childStatusEntity.setCompleteTime(childTimeArray[i][j]); childStatusEntity.setIsfinished(true); childList.add(childStatusEntity); } groupStatusEntity.setChildList(childList); groupList.add(groupStatusEntity); } return groupList; } }
源码下载:源码下载