08 ListView 优化

ListVie的优化


1 固定ListView长宽高

如下图在清单文件中:

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>

原因解释:

我们假设ListView 宽高为Wrap_content那么每次只要ListView加载一个item(某个条目)将会重新计算长宽高带来资源负担;

对比

我们先先来看看适配器的代码(BaseAdapter)


package com.fmy.ListViewDemo2.adpater;

import java.util.List;

import com.fmy.ListViewDemo2.R;
import com.fmy.ListViewDemo2.been.Person; import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; public class MyAdpater extends BaseAdapter{ List<Person> list;
Context context; class viewHold {
TextView tv ;
}
public MyAdpater(List<Person> list, Context context) {
super();
this.list = list;
this.context = context;
} @Override
public int getCount() {
Log.e("==", "getCount");
return 3;
} @Override
public Object getItem(int position) {
Log.e("==", "getItem");
return position;
} @Override
public long getItemId(int position) {
Log.e("==", "getItemId");
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("==>>", "POSTION:"+position);
View view= null;
viewHold tag = null;
if (convertView==null){
LayoutInflater inflater = LayoutInflater.from(context);
view = inflater.inflate(android.R.layout.simple_spinner_item, parent,false);
viewHold hold = new viewHold();
hold.tv=(TextView) view;
view.setTag(hold);
tag = hold;
}else{
view =convertView;
tag = (viewHold) view.getTag();
}
tag.tv.setText("你好");
return view;
} }


  • 我们假设第一种情况设置长宽高为固定值 输出结果:08 ListView 优化可以发现输出结果和加载的内容长度一致 证明只执行了三次getView

  • 我们再看看包裹内容的输出结果: 08 ListView 优化可以看到输出了N多条信息证明执行了getView多次 因为每次你加载一个item就会重新计算ListView的长宽高

2判断缓存View是否存在

public View getView(int position, View convertView, ViewGroup parent)

此方法每次调用都会自动缓存return的View所以 我们只会判断是否View是否存在,如果存在则直接使用 ,如果不存在那么用填充器在生成.

原因:

用户每次滑动一次看到新的Item的时候就会调用getView 如果用户滑动过快 每次填充次数太多生成过多的View 或者内存不足 等导致内存溢出而奔溃掉

代码: 在上面

3保存填充View的子控件对象

原因

我们一般填充一个View 后给其子元素控件赋值 但是用findViewId是会遍历整个ID文件的非常耗费资源因此我们 创建一个对象 里面创建子元素的控件对象,然后在存入View.setTag中 然后我们使用的取出调用即可

上一篇:【Win 10应用开发】把文件嵌入到XML文档


下一篇:【学】jQuery的源码思路2——$符号是如何封装的