android 一个页面内 多个listview的实现
如果很平常的两个listview组件竖直放在linearLayout布局中,结果是:
两个listview 很独立,中间似乎有个分割线,完全吧他们分离了,各自独立滚动,如果上面的listview把整个屏幕占据了,那么下面的listview永远滚不上来了,看不到了。
网上关于这个话题大约有两种方法解决:
(1)有多少个listview就用多少个listview组件,然后放在一个LinearLayout布局里面,linearLayout布局在放入Scrollview中。
这样做,必须先计算出每个listview被对应的adapter适配之后的实际高度,然后设置listview为这个高度。再放入scrollview中ok了。
(2)不管有多少个listview,都放在一个listview,用一个adapter适配,在listview组件对应的数据存储结构list中,设置flag标志位,在adapter中再对不同的flag做不同的适配。
一开始,项目中使用的第一种方法,随着项目的进行,发现第一种方法会在很多种情况下不适应,最严重的问题,就是第一种方法非常耗时,已经到了一种无可忍受的地步了。
一个很常见的例子,城市列表,有两个list:热门城市、全部城市
假如用第一种方法,先计算两个listview在对应的adapter适配后的高度:
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = ;
for (int i = ; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(, );
totalHeight += listItem.getMeasuredHeight();
} ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - ));
listView.setLayoutParams(params);
}
其实从这段代码中,和上面这个需求,问题已经可以看出来了。
adapter有一个方法getView,这个方法是如果这个listview的某行将要在屏幕上显示了,系统就会自动调用getview得到这个布局,然后显示。
也就是每次被调用的次数,只是屏幕上能显示的条数,最多也就是10条左右。
而一次计算高度就要对每一条调用getview,for循环里面:
View listItem = listAdapter.getView(i, null, listView);
是非常耗时的,尤其对于全部城市,几百条,3~4秒肯定是要的。所以面对这个需求,第一种方法是不可行。
除了耗时,第一种方法,维护性也不好。就比如,一个页面中,listview的数据是不定的,是动态计算得到的。用第一种方法分散到多个listview,对于一些事件监听,不好操作。
下面讲解下第二种方法的具体实现
拿上面城市列表具体
分两块:
1、数据dataList
2、adapter
1、datalist填充:
主要以一个flag标记,对于城市列表共有两种布局:
一个是头信息
一个是具体的城市
代码:
cityList.clear();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("city", new City(, "热门城市", '#'));
cityList.add(map1); List<City> cities = getHotCity(); for (City city : cities) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("is_selected", false);
map.put("city", city);
cityList.add(map);
} Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("city", new City(, "全部城市", '$'));
cityList.add(map2); index++;
cities = getAllCity(); for (City city : cities) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("is_selected", false);
map.put("city", city);
cityList.add(map);
}
哦~这个好像没用到flag标记,直接判断city的name了~~~
2、adapter适配:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
City city = (City) listData.get(position).get("city");
String nameString = city.getName();
if (nameString.compareTo("热门城市") == ) {
convertView = mInflater.inflate(headResource, null);
((TextView) convertView.findViewById(R.id.label)).setText("热门城市");
return convertView;
}
if (nameString.compareTo("全部城市") == ) {
convertView = mInflater.inflate(headResource, null);
((TextView) convertView.findViewById(R.id.label)).setText("全部城市");
return convertView;
} convertView = mInflater.inflate(listResource, null);
((TextView) convertView.findViewById(R.id.label)).setText(nameString);
ImageView isSelectedImageView = (ImageView) convertView.findViewById(R.id.is_selected); // boolean isSelected = (Boolean) listData.get(position).get("is_selected"); int whichIsSelected = (Integer) listData.get(getCount() - ).get("which_is_selected"); if (city.getId() == whichIsSelected)
isSelectedImageView.setBackgroundResource(R.drawable.is_selected_yes);
else
isSelectedImageView.setBackgroundResource(R.drawable.is_selected_no); return convertView;
}
对于各行的点击操作也可以根据flag统一处理。维护起来非常方便。
android 一个页面内 多个listview的实现的更多相关文章
- Android 一个页面上下两个ListView的页面显示
Android 一个页面上下两个ListView,当上面的ListView过长时,下面的List基本没有了滑动空间,查阅网上资料,解决办法基本是采用ScrollView做页面滑动,notifyData ...
- android一个页面上多个listview
android一个页面上多个listview,在滚动的时候,需要两个listview能够一起滚动,看起来是一个view. 这个功能的具体实现,参考: http://blog.csdn.net/xia2 ...
- Android实现页面跳转、ListView及其事件
Android实现页面跳转.ListView及其事件 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 进入主页面后,使用ListView实现特 ...
- android进入页面会定位到ListView问题解决方法
在我们的页面中如果存在有ListView,当我们进入这个activity时,页面会定位到ListView的位置去,而不是activity的头部,这是由于ListView会去默认获取焦点所造成的. 解决 ...
- iScroll框架解析——Android 设备页面内 div(容器,非页面)overflow:scroll; 失效解决(转)
移动平台的活,兼容问题超多,今儿又遇到一个.客户要求在弹出层容器内显示内容,但内容条数过多,容器显示滚动条.按说是So easy,容器设死宽.高,CSS加属性 overflow:scroll; -we ...
- Android 进入页面默认定位到ListView的解决方法
由于ListView会默认去获取焦点,如果说ListView在页面的下方的话,那么点击条目进入新页面并退出,那么这时候就会定位到ListView这里,而不是展示头部. 解决这个问题,只需要在Lis ...
- Android 可拖动列表项的ListView
需求分析 一个界面内两个ListView 我关注的栏目列表 上面的要长按后可拖动排序 点击减号后列表项消失 下面列表增加一行 同时存储相应字符串到本地作为标记 未关注栏目列表 普通ListView 点 ...
- 如何绑定android点击事件--跳转到另一个页面并实现关闭功能?
一.点击按钮跳转到另一个页面. eg:实现从一个页面点击跳转到另一个页面 1.首先在一个布局文件(.XML)中绘画了一个跳转按钮(id为btn1): <Button androi ...
- Android一个ListView列表之中插入两种不同的数据
http://www.cnblogs.com/roucheng/ Android一个ListView列表之中插入两种不同的数据 代码如下: public class ViewHolder{ Butto ...
随机推荐
- 浅谈Android自定义锁屏页的发车姿势
一.为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸 ...
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...
- CSS hack常用方案(摘选)
邮箱因为默认了line-height?:170%,导致采用table元素时继承问题,可以采用line-height:50% 很好解决. 常 在使用float时,后面的显示不正常,因为继承了float了 ...
- iOS UIKit:TableView之表格创建(1)
Table View是UITableView类的实例对象,其是使用节(section)来描述信息的一种滚动列表.但与普通的表格不同,tableView只有一行,且只能在垂直方向进行滚动.tableVi ...
- SQL给字段加上统一的某个字符
表名:News 字段名:No_id Update News set No_id='字符'+No_id
- css:nth-of-type()选择器用法
今天做一个页面,无意中看到这个nth-of-type感觉挺方便的,之前单双行有的有横线,有的无横线一般在html中单独再写border-right:none等之类的.现在发现这个好东西赶紧记录下来. ...
- 建立一个方法的attribute,可以放在任意方法上,可以自动记录方法出错时的信息,就不用写try 。。cacth. 【注意】 不是在asp.net MVC下,是在普通三层结构下写的的特性。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- java 反射 - 获取成员变量的值.
通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = &q ...
- Shell编程之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- SQL,学习基础2
列=字段, 记录=实体 事物日志文件(用来记录数据库的增删情况,扩展名LDF) 数据库文件(但是只有一个是主数据库文件(即用它来启动的),其余为次数据库文件)mdf 数据类型: 整形(整数)——in ...