ListView如何优化
1、ListView 如何提高其效率?
当 convertView 为空时,用 setTag()方法为每个 View 绑定一个存放控件的ViewHolder 对象。 当 convertView 不为空, 重复利用已经创建的 view 的时候,
使用 getTag()方法获取绑定的 ViewHolder 对象,这样就避免了 findViewById,
对控件的层层查询,而是快速定位到控件。
① 复用 ConvertView,使用历史的 view,提升效率 200%
② 自定义静态类 ViewHolder,减少 findViewById 的次数。提
升效率 50%
③ 异步加载数据,分页加载数据。
④ 使用 WeakRefrence 引用 ImageView 对象
2、当 ListView 数据集改变后,如何更新 ListView?
使用该 ListView 的 adapter 的 notifyDataSetChanged()方法,该方法会使 ListView 重新绘制。
3、ListView 如何实现分页加载
① 设 置 ListView 的 滚 动 监 听 器 : setOnScrollListener(new OnScrollListener{….})
在 监 听 器 中 有 两 个 方 法 : 滚 动 状 态 发 生 变 化 的 方 法(onScrollStateChanged)和 listView 被滚动时调用的方法(onScroll),
② 在滚动状态发生改变的方法中,有三种状态:
手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: // 滑翔
静止状态: SCROLL_STATE_IDLE: // 静止
对不同的状态进行处理:
分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每
次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。
4、ListView 可以显示多种类型的条目吗?
这个当然可以的,ListView 显示的每个条目都是通过 baseAdapter 的getView(int position, View convertView, ViewGroup parent)来展示的,理论
上我们完全可以让每个条目都是不同类型的 view。 除 此 之 外 adapter 还 提 供 了 getViewTypeCount ( ) 和getItemViewType(int position)两个方法。
在 getView 方法中我们可以根据不同的 viewtype 加载不同的布局文件
5、ListView 如何定位到指定位置?
可以通过 ListView 提供的 lv.setSelection(listView.getPosition());方法。
6、如何在 ScrollView 中如何嵌入 ListView?
通常情况下我们不会在 ScrollView 中嵌套 ListView,但是如果面试官非让我们嵌套的话也是可以的。
在 ScrollView 添加一个 ListView 会导致 listview 控件显示不全,通常只会显示一条,这是因为两个控件的滚动事件冲突导致。 所以需要通过 listview 中的
item 数量去计算 listview 的显示高度,从而使其完整展示,如下提供一个方法供大家参考。
lv = (ListView) findViewById(R.id.lv);
adapter = new MyAdapter();
lv.setAdapter(adapter);
setListViewHeightBasedOnChildren(lv);
----------------------------------------------------
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() *
(listAdapter.getCount() - 1));
params.height += 5;
// if without this statement,the listview will be a
// little short
listView.setLayoutParams(params);
}
现阶段最好的处理的方式是: 自定义 ListView,重载 onMeasure()方法,设置全部显示。代码如下:
package com.meiya.ui;
import android.widget.ListView;
public class ScrollViewWithListView extends ListView {
public ScrollViewWithListView(android.content.Context context,
android.util.AttributeSet attrs) {
super(context, attrs);
}
/**
* Integer.MAX_VALUE >> 2,如果不设置,系统默认设置是显示两条
*/
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
7、ListView 中如何优化图片
图片的优化策略比较多。
1、处理图片的方式:
如果 ListView 中自定义的 Item 中有涉及到大量图片的, 一定要对图片进行细心的处理,因为图片占的内存是 ListView 项中最头疼的,处理图片的方法
大致有以下几种:
①、不要直接拿路径就去循环 BitmapFactory.decodeFile;使用 Options 保存图片大小、不要加载图片到内存去。
②、对图片一定要经过边界压缩尤其是比较大的图片,如果你的图片是后台服务器处理好的那就不需要了
③、在 ListView 中取图片时也不要直接拿个路径去取图片,而是以WeakReference ( 使 用 WeakReference 代 替 强 引 用 。 比 如 可 以 使 用
WeakReference mContextRef)、SoftReference、WeakHashMap 等的来存储图片信息。
④、在 getView 中做图片转换时,产生的中间变量一定及时释放
2、异步加载图片基本思想:
1)、 先从内存缓存中获取图片显示(内存缓冲)
2)、获取不到的话从 SD 卡里获取(SD 卡缓冲)
3)、都获取不到的话从网络下载图片并保存到 SD 卡同时加入内存并显示
(视情况看是否要显示)
原理:
优化一:先从内存中加载,没有则开启线程从 SD 卡或网络中获取,这里注意从 SD 卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅。
优化二:于此同时,在 adapter 里有个 busy 变量,表示 listview 是否处于滑动状态,如果是滑动状态则仅从内存中获取图片,没有的话无需再开启线程去
外存或网络获取图片。
优化三:ImageLoader 里的线程使用了线程池,从而避免了过多线程频繁创建和销毁,如果每次总是 new 一个线程去执行这是非常不可取的,好一点的
用的 AsyncTask 类,其实内部也是用到了线程池。在从网络获取图片时,先是将其保存到 sd 卡,然后再加载到内存,这么做的好处是在加载到
内存时可以做个压缩处理,以减少图片所占内存。
8、ListView 中图片错位的问题是如何产生的
图片错位问题的本质源于我们的 listview 使用了缓存 convertView, 假设一种场景,一个 listview 一屏显示九个 item,那么在拉出第十个 item 的时候,
事实上该 item 是重复使用了第一个 item,也就是说在第一个 item 从网络中下载图片并最终要显示的时候,其实该 item 已经不在当前显示区域内了,此时显示
的后果将可能在第十个 item 上输出图像,这就导致了图片错位的问题。所以解决之道在于可见则显示,不可见则不显示。
9、如何刷新 ListView 中单个 item 的数据,不刷新整个ListView 的数据?
修改单个 Item 的数据,然后调用适配器的 notifyDataSetChanged()方法
ListView如何优化的更多相关文章
- 【腾讯Bugly干货分享】跨平台 ListView 性能优化
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- android技巧(二)listview的优化
对于listview的优化有以下三个措施: 1.原有listview每一个item显示时都会调用一次getView()方法,实际上对于ListView而言,只需要保留能够显示的最大个数的view即可, ...
- Android Listview 性能优化
首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewH ...
- Android进阶笔记14:ListView篇之ListView性能优化
1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...
- BaseAdapter以及对ListView的优化(转)
背景 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属ge ...
- ym——Android之ListView性能优化
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...
- Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化
Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大 ...
- Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)
在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可 ...
- ListView的优化问题
listview算是我们app中较为常用的控件之一了.而如何优化也是一个问题. listview的优化一般分为两类. 一布局优化. 对布局的优化是大家了解的. 1.复用convertview.andr ...
随机推荐
- 201521123072《java程序设计》第十一周学习总结
201521123072<java程序设计>第十一周学习总结 1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问 ...
- 201521123117 《Java程序设计》第9周学习总结
1. 本周学习总结 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 经常出现Numbe ...
- 201521123104 《Java程序设计》 第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1. finally(题目4-2) 1.1 截图你的提交结果(出现学号) 1.2 4-2中f ...
- hdu 6197 array array array
array array array Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- python实例编写(2)--等待,一组对象,层级元素,frame对象处理
一.设置等待 #coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDri ...
- 原型那些事 - JavaScript深入浅出(三)
前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...
- Bootstrap对齐方式
<p class="text-left">我居左</p> <p class="text-center">我居中</p& ...
- 保存数据到sdcard中去
这里只贴上核心的代码:其它自行脑补!
- Angular2开发拙见
本文集中讲讲笔者目前使用ng2来开发项目时对其组件的使用的个人的一些拙劣的经验. 先简单讲讲从ng1到ng2框架下组件的职责与地位: ng1中的一大特色--指令,分为属性型.标签型.css类型和注释型 ...
- myeclipse一些快捷键 错了或者没说到补充下
Ctrl + 1 快速修复Ctrl + D 删除当前行 Ctrl + Alt + ↓ 复制当前行到下一行(复制增加)Ctrl + Alt + ↑ 复制当前行到上一行(复制增加)Alt + ↓ 当前行 ...