android 分享一个处理BaseAdapter,getView()多次加载的方法
一:BaseAdapter介绍
BaseAdapter是listview,gridview等列表,使用的数据适配器,它的主要用途是将一组数据传到ListView、Spinner、Gallery及GridView等UI显示组件,如果listView列表的数据项过多,如1000项,我们如果把这1000项全部放到界面中去,软件直接内存溢出了,BaseAdapter刚才可以帮我们解决这个问题,BaseAdapter工作原理图如下:

从上图中看出,如果我们有1000个数据项,实际显示的只有7项,其它的缓存在Recycler中,Recycler类似于消息对列,用来保存未显示在ui上的数据项,如果顶部(或底部)通过滚动,从listView界面中滑出,Recycler就将该数据项,添加到消息对列,如上图中,第一项已经从界面中滑出,当第一项重新滑进的时候,android会判断第一项是否加载过,如果有那么就重新设置第一项的数据源,然后显示。当第一次加载数据项,或者上滑,或者下滑显示数据项的时候,就会调用getView()方法,然而很多时候,getView()方法系统会调用多次,调用多次就会多次刷新界面,性能会降低,比如界面会卡顿等。
/** @params position 需要显示的数据下标,从0开始
@params view 显示的视图
@ViewGroup 视图的组
*/
public View getView(int position, View view, ViewGroup viewGroup)
二:解决办法
1:网上常用的方法
<ListView
android:id="@+id/lv_messages"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
网上说执行多次原因是因为每显示一个VIew,它都去测量view的高度,执行measure方法,导致getView执行多次,但该listView嵌套在ScrollView时,BaseAdapter的getView()方法一样会调用多次。
2:重写ListView的onMeasure和onLayout方法。
我重写ListView的onMeasure和onLayout方法,定义一个,是否第一加载的变量boolean isOnMeasure=false,然后在BastAdapter的getView方法,判断是否第一次加载界面,通过这个方法来处理这个问题.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { isOnMeasure = true;
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
} @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
isOnMeasure = false;
super.onLayout(changed, l, t, r, b);
}
三:完整代码
1:重写listView
public class ScrollListView extends ListView {
private boolean isOnMeasure;
public boolean isMeasure() {
return isOnMeasure;
}
public ScrollListView(Context context) {
super(context);
}
public ScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
isOnMeasure = true;
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
isOnMeasure = false;
super.onLayout(changed, l, t, r, b);
}
}
2:activity的xml
<view.ScrollListView
android:id="@+id/orderGoodsList"
style="@style/list_normal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/line3"
android:background="@color/gray_f2"
android:divider="@color/gray_f2"
android:dividerHeight="1dip" >
</view.ScrollListView>
3:适配器代码
protected ViewGroup viewGroup;
@Override
public void initData(View view, Object viewHolder, int position) {
if (!((BaseGridView) viewGroup).isMeasure()) {
//第一次加载,处理界面ui
}else{
//不是第一次加载,不处理任何事
}
}
如果你有更好的方法,也请你留下分享一下你的方法,谢谢!
android 分享一个处理BaseAdapter,getView()多次加载的方法的更多相关文章
- android:分享 一个很强大的LOG开关---Log.isLoggable
标签:android分享 一个很强大的log开 1.API亮点: 此API可以实现不更换APK,在出问题的手机上就直接能抓到有效log,能提升不少工作效率. 2.API介绍 最近在解决短信问题时,看到 ...
- android 让一个控件按钮居于底部的几种方法
android 让一个控件按钮居于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_ ...
- [转]android 让一个控件按钮居于底部的几种方法
本文转自:http://www.cnblogs.com/zdz8207/archive/2012/12/13/2816906.html android 让一个控件按钮居于底部的几种方法 1.采用lin ...
- Android图片管理组件(双缓存+异步加载)
转自:http://www.oschina.net/code/snippet_219356_18887?p=3#comments ImageManager2这个类具有异步从网络下载图片,从sd读取本地 ...
- Android UI--自定义ListView(实现下拉刷新+加载更多)
Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...
- Loader拉取图片,由于redirect重定向,导致策略文件无效 设置checkPolicyFile后还是无效:需要一个策略文件,但在加载此媒体时未设置 checkPolicyFile 标志
大家好,在这里分享一下flash里边处理redirect的方法. 一般而言,大家不会遇到这个问题,毕竟图片地址一般杠杠的,不会redirect.但昨天在拉取空间的照片就会出现redirect.神啊!! ...
- android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题
android 在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...
- Android图片异步加载的方法
很多时候,我们在加载大图片或者需要处理较多图像数据的时候,希望显示效果能好点,不至于因为图片解码耗时产生ANR等情况,不得不说异步加载是个不错的方法.说到异步加载,避免application出现ANR ...
- 一个页面从输入URL到加载显示完成,发生了什么?
面试经典题--URL加载 一.涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns.http):DNS解析成IP并完成http请求发送: 传输层(tcp.udp):三次握手四次挥手模 ...
随机推荐
- app.config 配置多项 配置集合 自定义配置(2)
上一篇说了利用app.config自定义节点配置,那是利用工具来实现,其实也一全部编码的方式来实现.举一个栗子.Simpson一家有父亲James,母亲Kate,和三个儿女Jim,Aaron和Luka ...
- Django总结
Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 web 应用上有 趣的关键性的东西.为了达到这个目标,Django 提供了通用W ...
- 2017年php面试题汇总
1.http状态码 200 这个没有什么好说的,是代表请求被正常的处理成功了 302 代表临时重定向 400 400表示请求报文中存在语法错误.需要修改后再次发送 403 表明请求访问的资源被拒绝了. ...
- vimgdb安装
vimgdb install ************** a) You need: vim-7.3.tar.bz2 http://www.vim.org/sources.php vimgdb- (t ...
- MySQL5.5编译安装以及Debug
MySQL5.5以上版本安装是需要cmake 安装步骤: 设置编译参数cmake -DCMAKE_INSTALL_PREFIX='/data1/guosong/mysql_debug' -DDEF ...
- phpcms实现全站搜索
如果制作的静态页面中有搜索功能,那么使用phpcms进行替换怎么替换呢?会不会越到很多的麻烦呢?接下来进行phpcms替换静态页面中的搜索功能. 第一步:搜索页面的form表单提交书写,form表单怎 ...
- jmockit学习总结
mock类型和实例 从依赖的测试代码调用的方法和构造函数是mock(模拟)的目标. Mocking提供了我们需要的机制,以便将被测试的代码与(一些)依赖关系隔离开来.我们通过声明适当的模拟字段和/或模 ...
- C# WPF动点任意移动气泡画法(解决方案使用到数学勾股定理、正弦定理、向量知识)。
许久没写博客了,最近在研究WPF下气泡的画法,研发过程还是比较艰辛的(主要是复习了高中的数学知识,MMP全忘光了),这篇博客主要是提供一个思路给大家参考,如果有大神还有更好的解决方案可以不吝您的言论尽 ...
- (一)IDEA工具开第一个springboot应用之helloworld
(一)IDEA工具开第一个springboot应用之helloworld 一.前置知识 1.maven相关知识 2.spring注解 3.RESTful API 二.idea开发第一个springbo ...
- laravel5.3统计 withCount()方法的使用
在laravel5.3之后可以使用withCount()这个方法. 注意:一定要是5.3版本之后,5.2和5.1都会报方法未定义 举个栗子: App\Post::withCount('comments ...