上两篇讲到了用listView和recyclerView来实现时光轴,这一篇我们用ExpandableListView来实现时光轴,废话不多说,直接来代码。

还是先activity_main.xml

<?

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" >
<View
android:id="@+id/top_line"
android:layout_width="match_parent"
android:layout_height="1dp"
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" /> <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>
<?

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/img_line_point"
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>

非常easy的布局也就是一个组标题。

接着是child_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:orientation="horizontal"
android:gravity="center_vertical" >
<ImageView
android:padding="8dp"
android:id="@+id/img"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="50dp"
android:scaleType="fitXY" /> <TextView
android:id="@+id/content_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:layout_marginLeft="70dp"
android:layout_marginTop="6dp"
android:textColor="#999999" />
</LinearLayout>

非常easy就是左边图片右边文字。

然后来看代码,先来数据适配器

       package com.zy.adapter;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.zy.R;
import com.zy.entity.ChildStatusEntity;
import com.zy.entity.GroupStatusEntity;
import com.zy.entity.TimeFormat;
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() { return groupList == null ? 0 : groupList.size();
} /**
* 返回二级Item总数
*/
@Override
public int getChildrenCount(int groupPosition) {
return groupList == null ? 0
: (groupList.get(groupPosition) == null ? 0 : (groupList
.get(groupPosition).getChildList() == null ? 0
: 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) {
return childPosition;
}
@Override
public boolean hasStableIds() {
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(TimeFormat.format("yyyy.MM.dd",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.content_text = (TextView) convertView
.findViewById(R.id.content_text);
viewHolder.img=(ImageView) convertView.findViewById(R.id.img);
}
viewHolder.content_text.setText(entity.getContentText());
viewHolder.img.setImageResource(entity.getImgSrc());
convertView.setTag(viewHolder);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
} private class GroupViewHolder {
TextView groupName;
}
private class ChildViewHolder {
public TextView content_text;
public ImageView img;
}
}
这就是简单的ExpandableListView的适配器的写法,不明确的自己去查api咯。
然后里面封装了2个实体对象,当然也就是group和child的类对象:
package com.zy.entity;
import java.util.List;
/**
* 一级Item实体类
*
*
*/
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;
}
}
package com.zy.entity; /**
* 二级Item实体类
*
* @author zihao
*
*/
public class ChildStatusEntity {
/** 估计完毕时间 **/
private String contentText;
/** 是否已完毕 **/
private boolean isfinished;
private int imgSrc;
public int getImgSrc() {
return imgSrc;
}
public void setImgSrc(int imgSrc) {
this.imgSrc = imgSrc;
}
public String getContentText() {
return contentText;
}
public void setContentText(String contentText) {
this.contentText = contentText;
}
public boolean isIsfinished() {
return isfinished;
}
public void setIsfinished(boolean isfinished) {
this.isfinished = isfinished;
}
}

哈哈接下来是mainActivity咯;

       package com.zy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import com.zy.R;
import com.zy.adapter.StatusExpandAdapter;
import com.zy.entity.ChildStatusEntity;
import com.zy.entity.DateComparator;
import com.zy.entity.GroupStatusEntity;
public class MainActivity extends Activity {
private ExpandableListView expandlistView;
private StatusExpandAdapter statusAdapter;
private Context context;
private int count = 0;
@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();
expandlistView.expandGroup(0);
for (int i = 0; i < groupCount; i++) {
if (i <= 1) {
expandlistView.expandGroup(i);
}
} expandlistView.setOnGroupClickListener(new OnGroupClickListener() { @Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return false;
}
});
expandlistView.setOnGroupExpandListener(new OnGroupExpandListener() { @Override
public void onGroupExpand(int groupPosition) {
count++;
for (int i = 0, count = expandlistView
.getExpandableListAdapter().getGroupCount(); i < count; i++) {
if (groupPosition != i && count > 2) {// 关闭其它分组
expandlistView.collapseGroup(i);
count = 1;
}
}
}
});
} private List<GroupStatusEntity> getListData() {
List<GroupStatusEntity> groupList;
String[] strArray = new String[] { "20140710", "20081201", "20150809" };
String[][] childTimeArray = new String[][] {
{
"敬往事一杯酒,再爱也不回头",
"择一城终老,遇一人白首。",
"有时候邀女生出来玩她拒绝你的原因仅仅有两个,一是她懒得洗头,二是你的邀请不值得她洗头。 女生非要约人出来也有两个原因,一是她洗了头不出来玩不甘心,二是突然非常想吃某家的东西。",
"我见过千万人像你的发像你的眼却都不是你的脸。" },
{
"你说长相不重要,是由于你长了一张就算刚睡醒也敢自拍的脸。你说成绩不重要,是由于你随随便便又不小心考了次年级前五。你说恋爱不重要。是由于你身边备胎多的能够摆四五桌麻将了。 你说家境不重要,是由于你有一个看你皱一下眉就给你买新款的父母。 你说健康不重要,是由于你不会半夜由于疼痛而翻来覆去咳得撕心裂肺。 你说不重要只是是由于你已经拥有了,你说不重要只是是由于你从来不知道别人的努力和挣扎。",
"你永远不知道在你发了个“嗯”或者“哦”还能继续回复你的人。是有多在乎你!",
"最想说的话在眼睛里,草稿箱里。还有梦里" },
{ "那些花了好久才想明确的事,总是会被偶尔的情绪失控所有推翻。 ",
"折磨人的不是离别,而是感动的回顾,让人非常easy站在原地还以为回得去", "敬往事一杯酒,再爱也不回头!",
"能够一杯滚水烫死我,也能够一杯冰水冷死我,但不能一杯温水耗着我,我要的是黑白分明直接利落" } };
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.setContentText(childTimeArray[i][j]);
if (j % 3 == 0) {
childStatusEntity.setImgSrc(R.drawable.one);
}
if (j % 3 == 1) {
childStatusEntity.setImgSrc(R.drawable.two);
}
if (j % 3 == 2) {
childStatusEntity.setImgSrc(R.drawable.three);
}
childStatusEntity.setIsfinished(true);
childList.add(childStatusEntity);
}
groupStatusEntity.setChildList(childList);
groupList.add(groupStatusEntity);
}
// 将数据依照时间排序
DateComparator comparator = new DateComparator();
Collections.sort(groupList, comparator);
return groupList;
}
}

哈哈写完了,看下效果图:

              

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

马蛋。手机差截图不用愁了,用asm.jar来显示生成图片传上来清晰多了。

执行asm.jar后是这种效果:

asm.jar的下载地址http://download.csdn.net/download/lxq_xsyu/6666965,我但是下了好几个不能用的,说什么清单文件为空,醉了,步骤呢

1、将其copy到platform-tools文件夹下

2、执行java -jar asm.jar就可以启动

按右键就出现如此菜单选项:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图片就能够直接保存了(save image),zoom呢是设置屏幕的大小。哈哈哈。讲完了,又要去写代码了,最后附上源代码,想看下效果的能够去下一下。不要积分的http://download.csdn.net/detail/u013278099/8994581,哈哈时光轴系列的文章就写完了,认为能够的话就点个赞,不足之处给我指出,让我也多学习大家的知识。

时光轴三之 ExpandableListView版时光轴效果的更多相关文章

  1. 时光轴二之RecyclerView版时光轴效果

    由于如今RecyclerView是support-v7包中的新组件,是一个强大的滑动组件.与经典的ListView相比,相同拥有item回收复用的功能,可是直接把viewholder的实现封装起来,用 ...

  2. 时光轴一之listView实现时光轴效果

    尼玛.非要搞什么时光轴,一想简单的不就是个listView吗,然后一步一步来就好了,哈哈别看那么好看事实上不要想多了. 时光轴timeline最大的作用就是把过去的事物系统化.完整化.精确化.时间轴可 ...

  3. 使用ExpandableListView时间轴效果达到

    不废话,首先在地图上,查看结果 这是用ExpandableListView来实现时间轴效果,原理比較简单,以月份为第一级,以天为第二级来实现的. package com.hj.main; import ...

  4. ExpandableListView实现手风琴效果

    1. 效果示例图 2. 创建方法 (1)第一种方法与ListView等普通控件一样,直接在布局文件中添加ExpandableListView控件即可. (2)第二种方法则是创建一个Activity继承 ...

  5. jQuery系列(三):jQuery动画效果

    jQuery提供的一组网页中常见的动画效果,这些动画是标准的.有规律的效果:同时还提供给我们了自定义动画的功能. 1.显示动画 方式一: $("div").show(); 解释:无 ...

  6. jQuery自学笔记(三):jQuery动画效果

    jQuery隐藏和显示: 使用 hide( ) 和 show( ) 方法来隐藏和显示 HTML 元素: 语法: $(selector).hide(speed,callback); $(selector ...

  7. jQuery插件实例三:图片滚动[切换]效果一

    图片切换效果在很多网站上都能看到,是一种常见的广告/活动宣传方式,通常位于网页上端.这个插件是众多图片切换效果的形式中的一种,数据源可在前端配置,也可从后台通JSON格式传输数据,当然,数据格式是固定 ...

  8. QT 网络编程三(TCP版)

    QT客户端 //widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket& ...

  9. EF增删查改(三)------终极版

    1.Add #region 1.1 新增学生信息(定义成Int类型,返回受影响的行数) /// <summary> /// 新增学生信息 /// </summary> /// ...

随机推荐

  1. 搭建本地Tomcat

    1.下载自己需要的版本我安装的Tomcat8(https://tomcat.apache.org/). 2.根据自己的电脑下载需要的系统版本.我的电脑是Windows64位的操作系统 3.选择一个目录 ...

  2. Python 直接赋值、浅拷贝和深度拷贝全解析

    直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思).这个人比较自由单身狗嘛  可以恋爱可以分手  就是一个小屌丝. 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的 ...

  3. [转载] 高性能IO模型浅析

    转载自http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(B ...

  4. 五、VueJs 填坑日记之将接口用webpack代理到本地

    上一篇博文,我们已经顺利的从cnodejs.org请求到了数据,但是大家可以注意到我们的/src/api/index.js的第一句就是: // 配置API接口地址 var root = 'https: ...

  5. MVC 小案例 -- 信息管理

    前几次更新博客都是每次周日晚上到周一,这次是周一晚上开始写,肯定也是有原因的!那就是我的 Tomact 忽然报错,无法启动,错误信息如下!同时我的 win10 也崩了,重启之后连 WIFI 的标志也不 ...

  6. P1879 [USACO06NOV]玉米田Corn Fields

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  7. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  8. 项目实战4—haproxy 负载均衡和ACL控制

     haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...

  9. ASP.NET Core教程【二】从保存数据看特有属性与服务端验证

    前文索引: 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand" ...

  10. Python函数中如何定义参数

    一.位置参数:根据函数定义时的参数位置传递参数#形参和实参的个数必须一致def fun1(): print("运行结果") print("this is fun1(),n ...