自定义Adapter
public View getView(final int position,
ViewconvertView,
ViewGroupparent)
1、 布局视图复用
ListView中的getView原理
• 工作原理:
ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!
实际上Android为你缓存了视图。有个叫做Recycler的构件
Void getView(final int position, ViewconvertView, ViewGroup
parent){
View myView = convertView;
ViewHolder viewHolder = null;
if (myView == null) {
viewHolder = new ViewHolder();
myView = initChatView(
viewHolder, type,parent); // bad findViewById !
myView.setTag(viewHolder);
} else {
viewHolder =(ViewHolder) myView.getTag();
}
//复杂逻辑······
}
2、Mask复用
public void onMaskChanged(String key,Bitmap newMask) {
// TODO Auto-generated method stub
if(maskMap == null){
maskMap = new HashMap<String, Bitmap>();
}
maskMap.put(key, newMask);
}
public Bitmap getMask(String key) {
// TODO Auto-generated method stub
if(maskMap != null){
return maskMap.get(key);
}else{
return null;
}
}
3、优化getView中的算法
• 每次滑动ListView列表控件都会触发连续的getView操作
• 如果感觉滑动时很卡,从下面查找原因:
(1)getView中的计算时间过长(如大量使用
findViewById来查找子控件等)。
(2)getView中发生了内存泄漏,导致滑动列表时
内存占用急剧增加,直至ANR发生。
(3)没有复用回收的view。
(4)单个item的布局嵌套层次过深。