ListView的优化(多方面)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32673327/article/details/52043594

在网上看了许多关于ListView优化的文章,自己也码了这么长时间代码关于ListView的优化也有自己的一点心得,下面是我对ListView优化的一些见解。

为什么要对ListView进行优化?

很多时候我们直接对ListView的适配器进行编写完成之后,运行程序,如果ListView中有很多item,你一直上下滑动的时候程序突然崩了,这就是因为你不停的滑动的时候,一直在Findviewbyid这样就会一直耗费程序的内存,导致崩溃;

如何对ListView进行优化?

1.使用viewholder

class ViewHolder {
ImageView iv_item_jzw;
TextView tv_fireplace_name;
ImageView iv_item_jzw_next;
}

2.复用convertView

利用 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改变宽高,重用View可以减少重新分配缓存造成的内存频繁分配/回收;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
 
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_xfroom, null);
holder.tv_fireplace_name = (TextView) convertView.findViewById(R.id.tv_fireplace_name);
holder.iv_item_jzw = (ImageView) convertView.findViewById(R.id.iv_item_xfs);
holder.iv_item_jzw_next = (ImageView) convertView.findViewById(R.id.iv_item_xfs_next);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

XFRoom temp = list.get(position);

holder.tv_fireplace_name.setText( temp.getXf_room_name());
if (position == 0) {
convertView.setBackgroundResource(R.drawable.list_item_top);
} else if (position == (list.size() - 1)) {
convertView.setBackgroundResource(R.drawable.list_item_bottom);
} else {
convertView.setBackgroundResource(R.drawable.list_item_def);
}
 
return convertView;
}

3.图片的加载优化

如果ListView需要加载显示网络图片,我们尽量不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要在监听器里面监听ListView的状态,如果ListView滑动(SCROLL_STATE_TOUCH_SCROLL)或者被猛滑(SCROLL_STATE_FLING)的时候,停止加载图片,如果没有滑动(SCROLL_STATE_IDLE),则开始加载图片。 

4.减少item view的布局层级

这是所有layout都必须遵循的,布局层级过深会直接导致View的测量与绘制浪费大量的时间。

其他
1、利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView

的回收,当然类型不能太多

2、善用自定义 View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;

3、尽量能保证 Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView

将不会重新绘制这个 View,达到优化的目的;

4、每个Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小

的 Item

5、ListView 中元素避免半透明 

6、使用 RecycleView 代替, ListView 每次更新数据都要 notifyDataSetChanged(),,RecycleView 在性能和可定制性上

都有很大的改善,推荐使用。 


猜你喜欢

转载自blog.csdn.net/qq_32673327/article/details/52043594