相关资料:https://developer.android.com/training/improving-layouts/smooth-scrolling.html
http://stephen830.iteye.com/blog/1141532
http://trinea.iteye.com/blog/1484894
http://android-developers.blogspot.com/2009/05/drawable-mutations.html
使用ListView时,由于adapter会频繁调用getView(),如果列表的数据比较多,就会出现ListView滚动不平滑的现象。
为了使ListView平滑滚动,列出一下几个要点:
要点一:
在调用getView( position, convertView, parent)时使用convertView,避免新建View;
要点二:
在声明ViewHolder时,应当声明成static嵌套类;
要点三:
XML布局时把ListView及其父控件的layout_height设成fill_parent或固定高度(不一定有效果);
要点四:
不要作复杂的逻辑处理,可以使用异步加载减少UI阻塞的可能。
要点五:
使用WeakHashMap。
WeakHashMap<Integer, View> weakMap= new WeakHashMap<Integer, View>();
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(weakMap.get(position)==null){
convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
}
holder= new ViewHolder();
holder.age = (TextView) convertView.findViewById(R.id.age);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.age.setText(position+"");
holder.name.setText("name"+position);
convertView.setTag(holder);
weakMap.put(position, convertView);
}else{
convertView = weakMap.get(position);
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
由于WeakHashMap的特性,如果要对列表进行数据操作,例如读取item的id就会出问题。
要点六:
当需要适配的item view的高度不一样时,滚动条就会计算每个item的高度,比较耗资源,可以设置ListVIew的属性:
android:smoothScrollbar=“false”。