ListView性能优化

ListView在ScrollView中无法正确计算它的大小, 故不能显示正常的条目。

解决办法有:

1.重写ListView, 覆盖onMeasure()方法。

 1 public class WrapperListView extends ListView {
 2     public WrapperListView(Context context) {
 3         super(context);
 4     }
 5     public WrapperListView(Context context, AttributeSet attrs) {
 6         super(context, attrs);
 7     }
 8     public WrapperListView(Context context, AttributeSet attrs, int defStyleAttr) {
 9         super(context, attrs, defStyleAttr);
10     }
11     public WrapperListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
12         super(context, attrs, defStyleAttr, defStyleRes);
13     }
14     /**
15      * 重写该方法,达到使ListView适应ScrollView的效果
16      */
17     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
18         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
19         super.onMeasure(widthMeasureSpec, expandSpec);
20     }
21 }

2.动态设置LIstView的高度,不需要重写LIstView

只需要在setAdapter之后调用如下方法即可:

public void setListViewHeightBasedOnChildren(ListView listView) {// 获取ListView对应的AdapterListAdapter listAdapter = listView.getAdapter();if (listAdapter == null) {return;}int totalHeight = 0;for (int i = 0, len = listAdapter.getCount(); i < len; i++) {// listAdapter.getCount()返回数据项的数目View listItem = listAdapter.getView(i, null, listView);// 计算子项View 的宽高listItem.measure(0, 0);// 统计所有子项的总高度totalHeight += listItem.getMeasuredHeight();}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));// listView.getDividerHeight()获取子项间分隔符占用的高度// params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);}

另外,这时,这时最好给ListView之外嵌套一层LinearLayout,不然有时候这种方法会失效。

最后,尽量避免ScrollView嵌套Listview,可使用使用listview的addHeader() 函数来实现预期效果或者利用布局的特性达到预期效果。

 

ListView就是一个将数据集合以动态滚动的方式展示到用户界面的View

ListView的父类AbsListView中的内部类RecycleBin(防止ListView出现oom)

优化:

1. getview中的convertView中起到缓存作用,复用convertView,对convertView进行判空,为空则初始化,从而减少了很多不必要的View的创建、减少findViewById的次数

2.采用ViewHolder模式缓存item条目的引用,减少多次findViewByID的次数

3.避免在getView方法中做耗时操作

3.给listView设置滚动监听器 根据不同状态 不同处理数据 分批分页加载 根据listView的状态去操作,比如当列表快速滑动时不去开启大量的异步任务去请求图片

4.listview每个item层级结构不要太复杂
5.listview每个item中异步加载图片,并对图片加载做优化,(关于Listview分页加载和图片异步加载思路请看接下来的文章内容)
6.尽量能保证 Adapter 的 hasStableIds() 返回 true 这样在 notifyDataSetChanged() 的时候,如果item内容并没有变化,ListView 将不会重新绘制这个 View,达到优化的目的
7.在一些场景中,ScollView内会包含多个ListView,可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度,阻塞了UI线程导致卡顿现象出现,如果我们每一个item的高度都是均匀的,可以通过计算把listview的高度确定下来,避免卡顿现象出现。
8.使用 RecycleView 代替listview: 每个item内容的变动,listview都需要去调用notifyDataSetChanged来更新全部的item,太浪费性能了。RecycleView可以实现当个item的局部刷新,并且引入了增加和删除的动态效果,在性能上和定制上都有很大的改善
9.ListView 中元素避免半透明: 半透明绘制需要大量乘法计算,在滑动时不停重绘会造成大量的计算,在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置成不透明,滑动完再重新设置成半透明。
Listview的一些相关拓展
1. 打开套有 ListVew的 ScrollView的页面布局默认起始位置不是最顶部
解决办法有两种:
方法一:把套在里面的ListVew 不让获取焦点即可。listview.setFocusable(false);注意:在xml布局里面设置android:focusable=“false”不生效
方法二:myScrollView.smoothScrollTo(0,0);
2.上拉加载和下拉刷新怎么实现

1.继承自LIstView实现OnScrollListener
实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,
使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载

2.头部和尾部都是单独的两个继承自LinearLayout布局,通过LIstView的addHeaderView()和addFooterView()两个方法把其加载到LIstView中
3.必须实现3个构造方法,每个方法都要实现initView()
4.Visibility实现头部和底部布局显示与隐藏

3.Listview里有Button就点不动了你知道吗

当ListView的Item中包含button,item点击事件与Button控件(button换成TextView不会冲突)点击冲突解决办法
1.不再对item进行监听,而是在adapter中监听整个item布局convertView.setOnClickListener()实现item的点击事件
2.在item的布局文件中给button设置属性android:focusable="false"以防button抢占listview的点击

4.ListView图片异步加载实现思路

1.先从内存缓存中获取图片显示(内存缓冲)
2.获取不到的话从SD卡里获取(SD卡缓冲,,从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅)
3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

5.ViewHolder内部类非得要声明成static

这不是Android的优化,而是Java提倡的优化,
如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,使它成为静态成员类,而不是非静态成员类。
因为非静态成员类的实例会包含一个额外的指向外围对象的引用,保存这份引用要消耗时间和空间,并且导致外围类实例符合垃圾回收时仍然被保留。如果没有外围实例的情况下,也需要分配实例,就不能使用非静态成员类,因为非静态成员类的实例必须要有一个外围实例。

转载于:https://www.cnblogs.com/evolutionoflicorice/p/10219678.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断页面关闭的方法 UNLOAD/onbeforeunload

最近一个朋友做在线统计&#xff0c;问我怎么判断用户登陆和离开。获得用户登陆不用说了&#xff0c;大家都知道&#xff0c;判断离开的话就有一点问题了&#xff0c;如果说用户都是按照设计者的规定的范围触发退出事件离开的话那就没什么难度了&#xff0c;但是用户的离开方式…

mysql 第几周 时间戳_php时间戳函数实现计算第几周,以及当天所在周的具体日期范围...

<html><script language"javascript">function showdate(){c new Date(2008,1,29);//输入开学的日期.注意,月份是从0-11;comperc.getTime();//以2008年2月29日作为上半学期结束。然后记录新的开学日期var now new Date();//获取当前时间var d_nownow.ge…

java学习笔记④MySql数据库--03/04 DQL查询

03 使用DQL查询数据&#xff08;一&#xff09; 04 使用DQL查询数据&#xff08;二&#xff09; DQL 数据查询语言 select select * 方式效率低 AS 取别名 (给字段取别名,给表取别名,给计算结果取别名) as取别名时,可省略as distinct 去重 所有字段一起不重复算一条记录 selec…

2005国产空间信息系统软件测评结果揭晓

记者&#xff1a;云洲 来源&#xff1a;www.3sNews.net 责编&#xff1a;小柯 [3sNews讯]2005年12月27&#xff0c;为期两天的“地球观测与导航技术领域科技发展研讨会”于中国科技会堂胜利召开&#xff0c;备受业界关注的2005国产空间信息系统软件测评结果在会上揭晓&am…

mysql变量string_mysql sql语句有变量 time_t变量转换为string

1.char*变量 如果有两个指针变量不可以 需要一个转换为stringstring strCall ;strCall.assign(pCallInfo->m_szCallerNo,strlen(pCallInfo->m_szCallerNo));//char* 转换为stringstring sql "insert into tcallrecord values("strCall","pCallInfo-…

axios+vue实现动态渲染员工数据+数据是对象

<style>table{width: 600px;margin: 0 auto;text-align: center;border-collapse: collapse; /*合并边框哦*/}tr th,tr td{border: 1px solid pink;}</style><script src"../vue.js"></script><script src"../axios.js">&l…

[Translation]《击鼓》

"Live or die,meet or part,weve made oath,you and I;,7UZGive me your hand,Ill hold,and live together,till old.l"From: 《击鼓》I?©MYUP2U社区 -- 整理童年的记忆&#xff0c;释放知识的潜力&#xff0c;共享青春的激情&#xff0c;尽在MYUP2U&#xff0…

[vue] vue自定义事件中父组件怎么接收子组件的多个参数?

[vue] vue自定义事件中父组件怎么接收子组件的多个参数&#xff1f; 子组件传递多个参数&#xff0c;父组件用展开运算符获取个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关…

FLASH全屏,左右侧,闪烁广告及对错觉的代码补充.

<!--焦点图开始--> <script type"text/javascript"><!--var focus_width250; ------ flash的宽度var focus_height160; ------ flash的高度同样可以加上背景颜色 var focus_bgcolor160; ------ flash的背景颜色…

vscode调试angular2

调试步骤&#xff1a; 1.安装nodejs 2.安装vscode 3.vscode安装debugger for chrome插件 4.选择调试->打开调试配置&#xff0c;选择chrome配置&#xff0c;打开lauch.json,修改如下&#xff1a; {"version": "0.2.0","configurations": [{&q…

python实现组合问题_python3 最基本且简单的实现组合设计模式

&#xfeff;组合模式是把一个类别归为一个整体&#xff0c;并且组织多个整体之间的关系&#xff0c;使用通过树形结构来描述所有整体。一般的编写方式为一个类别对象下添加多个该对象的元素&#xff0c;该对象又为其它对象下的元素。简单来说就是一个学校有一个总部&#xff0…

[vue] 说下$attrs和$listeners的使用场景

[vue] 说下attrs和attrs和attrs和listeners的使用场景 <template><el-button v-on"$listeners" v-bind"$attrs" :loading"loading" click"myClick"><slot></slot></el-button> </template><s…

Windows下安装SQLPlus的帮助

Oracle 10G Server不在本机上&#xff0c;我希望安装SQLPlus的帮助。安装SQLPlus需要使用System User登录&#xff0c;但System已经被Lock掉了。还好有dba的权限。先Unlock System账号&#xff0c;并修改密码&#xff1a;-- UnlockALTER USER SYSTEM ACCOUNT UNLOCK;-- Modify …

python爬虫微博24小时热搜_GitHub - Writeup007/weibo_Hot_Search: 微博爬虫:每天定时爬取微博热搜榜的内容,留下互联网人的记忆。...

Weibo_Hot_Search都说互联网人的记忆只有七秒钟&#xff0c;可我却想记录下这七秒钟的记忆。项目已部署在服务器&#xff0c;会在每天的上午 11 点和晚上11 点定时爬取微博的热搜榜内容&#xff0c;保存为 Markdown 文件格式&#xff0c;然后上传备份到 GitHub 你可以随意下载查…

[vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢?

[vue] 分析下vue项目本地开发完成后部署到服务器后报404是什么原因呢&#xff1f; 1.检查nginx配置&#xff0c;是否正确设置了资源映射条件&#xff1b; 2.检查vue.config.js中是否配置了publicPath&#xff0c;若有则检查是否和项目资源文件在服务器摆放位置一致。个人简介 …

jQuery异步加载数据并添加事件示例

当时项目是通过树形栏进行权限控制的&#xff0c;管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作&#xff0c;可是用$(".XX").click();方法是不行的。1、之前用的是jq1.4.3 ,jq1.7一下都可以使用live()方法&#xff0c;来实现该功能 $(‘#div).live(‘…

python考试有什么用_Python有什么用?2020年学习Python的10个理由

如果你想学习 Python&#xff0c;但是不知道为什么要学习&#xff0c;那么这里有 10 个理由&#xff0c;强调了在 2020 年学习 Python 的好处。不过&#xff0c;这些问题取决于谁在问&#xff0c;也就是说&#xff0c;对于初学者来说&#xff0c;学习Python是有意义的&#xff…