ListView这个列表控件,是我们在开发当中使用频率比较高的一个控件。
既然是使用频率比较高,那么我们就有必要将它的使用方式保存,方便以后直接复制粘贴,把注意力放在架构上面,不用经常做代码搬运工(重复搬运)。
当然Android的API也提供了许多创建ListView适配器的快捷方式。例如ArrayAdapter、SimpleAdapter、SimpleCursorAdapter等。但是在日常的开发当中,我是从来不会使用系统自带的适配器。毕竟一个项目当中,大部分列表Item的高度、容纳的控件数量、控件类型、逻辑处理、事件的处理等等都是不同的,使用系统自带的完全不能胜任。
套用一句俚语:一切不以实际项目为例子的Sample都是耍*流*氓^_^
今天的简单实例为百度地图-收藏夹页面的收藏点列表的仿写(只是列表哟),下面我们先来看看原装正品效果图动画:
怎么样,够简单吧,不过虽然简单,却不能使用系统提供给我们的适配器来做,我们来自定义适配器。
一、纵观全局—-我们先来分析一下页面有哪些元素
1、一个列表(费话,我们就是来做列表的!^_^)。
2、一个餐厅名称、一个收藏时间、一个右箭头。
3、一条分隔线(这一个千万忘不得)。
4、点击Item会有交互颜色变化。
二、技术选型
1、这一步是不可少的哈,因为实现列表,我们有多种方式,ListView可以,RecyclerView也可以,当然硬布局+ScrollView也可以(这一个估计没人这么做)等等。这里,我们使用ListView。没什么原因,就因为今天是ListView的实例。^_^
2、名称和时间肯定使用TextView了。右箭头使用ImageView,由于这个箭头只是一个标识作用,没有集成事件之类的,所以不会选择ImageButton、Button等控件。
3、分隔线,这个就有讲究了。我们仔细观察,这个分隔线是从左到右,横跨整个列表的。实现它的方法,至少有两种:(1)使用Listview自带的divder. (2)写一个View到Item布局当中。
如果这个分隔线不是横跨整个列表,而是有左边距或右边距呢,比如分隔线是和文字以及时间控件左对齐的呢,我们就只能写到Item布局当中了。
4、选择使用Selector。
三、码代码
1、构造数据,模拟好像是在线获取的数据,这里我们封闭一个数据获取的方法即可,所有的数据增删查改等都在此方法内进行。
/**
* 数据封装,模拟从网络上获取到的数据
*
* @return 返回数据列表
*/
private List<RestaurantBean> getDatasFromNetwork() {
for (int i = 0; i < Constants.PLACE.length; i++) {
RestaurantBean restaurant = new RestaurantBean();
restaurant.setPlace(Constants.PLACE[i]);
restaurant.setTime(Constants.TIME[i]);
datas.add(restaurant);
}
//刷新列表,如果是真实的网络数据,则放到请求回调函数当中使用。
//注意如果是在异步线程中,应该怎么使用?它必须在主线程中执行!!
listViewSimpleAdapter.notifyDataSetChanged();
return datas;
}
以下附方法内使用到的常量:
package oliver.zhantao.oliverproject.constants;
/**
* 存放常量类
*
* Created by ZhanTao on 2017/4/17.
*/
public class Constants {
//地点列表
public static final String PLACE[] = {
"德克士(新世幻环球中心店)", "肯德基(九方餐厅)", "第18区海鲜拼盘", "邓家面馆",
"锦水缘餐厅", "麦地里(中海店)", "可可豆汤", "临江门火锅店",
"若水河鲜", "自贡鸿鹤鲜锅兔", "又见曾毛肚老火锅"
};
//时间列表
public static final String TIME[] = {
"2017-04-08" , "2017-04-09", "2017-04-10", "2017-04-11",
"2017-04-12", "2017-04-13", "2017-04-14" , "2017-04-15",