listview的优化建议
2016-07-05 21:08
246 查看
转载请注明出处:http://blog.csdn.net/u014761700
1首先,虽然大家都知道,还是提一下,利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View。ListView 中有一个回收器,Item 滑出界面的时候 View 会回收到这里,需要显示新的 Item 的时候,就尽量重用回收器里面的 View。
2利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView 的回收,当然类型不能太多;
3尽量让 ItemView 的 Layout 层次结构简单,这是所有 Layout 都必须遵循的;
善用自定义 View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;
4尽量能保证 Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView 将不会重新绘制这个 View,达到优化的目的;
5每个 Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小的 Item,特别推荐看一下这个文章:https://code.facebook.com/posts/879498888759525/fast-rendering-news-feed-on-android/
6为了保证 ListView 滑动的流畅性,getView() 中要做尽量少的事情,不要有耗时的操作。特别是滑动的时候不要加载图片,停下来再加载,这个库可以帮助你 Glide:https://github.com/bumptech/glide,
7使用 RecycleView 代替。 ListView 每次更新数据都要 notifyDataSetChanged(),有些太暴力了。RecycleView 在性能和可定制性上都有很大的改善,推荐使用。
8Item中有三个按钮,这样设置监听
通过传入的View v这个参数判断是哪一个button被点击,这样,无论View如何创建,你只创建了1个Listener对象,
如果想传item数据,可以将数据通过view 的tag带进来
public View getView(.....) {
....
v.setTag(key, getItem(position));
....
}
然后在listener中通过v.getTag()将数据取出。
或者是
class ViewHolder
implements OnClickListener{
int position;
TextView name;
public void
setPosition(int
position){
this.position
= position;
}
@Override public
void onClick(View
v) {
switch (v.getId()){
//XXXX }
}
}
public View
getView(int
position, View
convertView, ViewGroup
parent) {
ViewHolder holder
= null;
if (convertView
== null)
{
convertView =
inflater.inflate(R.layout.list_item,
parent, false);
holder =
new ViewHolder();
holder.name
= (TextView)
convertView.findViewById(R.id.name);
holder.name.setOnClickListener(holder);
convertView.setTag(holder); }
else {
holder =
(ViewHolder)
convertView.getTag();
} //设置holder
holder.name.setText(list.get(position).partname);
//设置position holder.setPosition(position);
return convertView;
}
1首先,虽然大家都知道,还是提一下,利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View。ListView 中有一个回收器,Item 滑出界面的时候 View 会回收到这里,需要显示新的 Item 的时候,就尽量重用回收器里面的 View。
2利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView 的回收,当然类型不能太多;
3尽量让 ItemView 的 Layout 层次结构简单,这是所有 Layout 都必须遵循的;
善用自定义 View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;
4尽量能保证 Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView 将不会重新绘制这个 View,达到优化的目的;
5每个 Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小的 Item,特别推荐看一下这个文章:https://code.facebook.com/posts/879498888759525/fast-rendering-news-feed-on-android/
6为了保证 ListView 滑动的流畅性,getView() 中要做尽量少的事情,不要有耗时的操作。特别是滑动的时候不要加载图片,停下来再加载,这个库可以帮助你 Glide:https://github.com/bumptech/glide,
7使用 RecycleView 代替。 ListView 每次更新数据都要 notifyDataSetChanged(),有些太暴力了。RecycleView 在性能和可定制性上都有很大的改善,推荐使用。
8Item中有三个按钮,这样设置监听
public MyAdapter () { myListener = new View.OnClickListener() { @override public void onClick(View v) { v.getTag() v.getId() //balabalabala... } }); }
通过传入的View v这个参数判断是哪一个button被点击,这样,无论View如何创建,你只创建了1个Listener对象,
如果想传item数据,可以将数据通过view 的tag带进来
public View getView(.....) {
....
v.setTag(key, getItem(position));
....
}
然后在listener中通过v.getTag()将数据取出。
或者是
class ViewHolder
implements OnClickListener{
int position;
TextView name;
public void
setPosition(int
position){
this.position
= position;
}
@Override public
void onClick(View
v) {
switch (v.getId()){
//XXXX }
}
}
public View
getView(int
position, View
convertView, ViewGroup
parent) {
ViewHolder holder
= null;
if (convertView
== null)
{
convertView =
inflater.inflate(R.layout.list_item,
parent, false);
holder =
new ViewHolder();
holder.name
= (TextView)
convertView.findViewById(R.id.name);
holder.name.setOnClickListener(holder);
convertView.setTag(holder); }
else {
holder =
(ViewHolder)
convertView.getTag();
} //设置holder
holder.name.setText(list.get(position).partname);
//设置position holder.setPosition(position);
return convertView;
}
相关文章推荐
- HDU 2425 Hiking Trip(bfs+优先队列)
- Java开发必备:java帮助文档网址下载或在线帮助
- 函数重载遇上函数默认值会发生什么?----二义性
- EventBus
- 为什么apache要设置虚拟主机
- Android 获取固定的dip、dp值
- POJ 3275 Floyd传递闭包
- [UE4教程] 图形学基础教程01--渲染管线 (带演示程序)
- POJ 3275 Floyd传递闭包
- 面试题16:反转链表
- String类和StringBuffer类的区别
- adb offline 解决
- 形参实参
- 关于Android Context------你应该心里稍微有个数
- Win32开发:完整的开发流程
- [bzoj4098] [Usaco2015 Open]Palindromic Paths
- sqlserver -- 解决sqlserver2008“Prevent saving changes that require table re_creation(阻止保存要求重新创建表的更改)”的问题
- 面试题28:字符串的排列
- Unity头戴式游戏制作视频教程
- hduTour Route【竞赛图的哈密顿回路】