在网上看到一种普遍优化就是在getView那里自定义一个ViewHolder具体代码如下:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder=new ViewHolder(); convertView = mInflater.inflate(R.layout.vlist2, null); holder.img = (ImageView)convertView.findViewById(R.id.img); holder.title = (TextView)convertView.findViewById(R.id.title); holder.info = (TextView)convertView.findViewById(R.id.info); holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); } holder.img.setBackgroundResource((Integer)mData.get(position).get("img")); holder.title.setText((String)mData.get(position).get("title")); holder.info.setText((String)mData.get(position).get("info")); holder.viewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInfo(); } });
但是我发现打印那个convertView出来的话,每次都是null的,也就是说每次都会是null,那优化何在呢?求解
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder=new ViewHolder(); convertView = mInflater.inflate(R.layout.vlist2, null); holder.img = (ImageView)convertView.findViewById(R.id.img); holder.title = (TextView)convertView.findViewById(R.id.title); holder.info = (TextView)convertView.findViewById(R.id.info); holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); } holder.img.setBackgroundResource((Integer)mData.get(position).get("img")); holder.title.setText((String)mData.get(position).get("title")); holder.info.setText((String)mData.get(position).get("info")); holder.viewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInfo(); } });
但是我发现打印那个convertView出来的话,每次都是null的,也就是说每次都会是null,那优化何在呢?求解
ViewHolder holder; if (convertView == null) {
System.out.println("convertView "+convertView);
convertView = inflater.inflate(R.layout.music_item, null);
holder = new ViewHolder();
holder.tv_music_name = (TextView) convertView
.findViewById(R.id.tv_music_name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_music_name.setText(map.get(position));
return convertView;
}
希望我的回答对你有帮助
1、holder的作用你应该可以看出来的。如果holder是static的话那么只实例化一次,如果多次调用的话那么起到了优化。
2、convertView是adapter的缓存机制设计的。你可以了解一下内存优化就知道了。如果你不用convertview的话那么它是不会进行缓存的。convertView也不是每次都是null,只是在第一次显示的时候是null,通俗一点就是在屏幕中的不是null,没有在屏幕中first-1和last+1其实也是有缓存的。
这是个人理解。推荐看看eoe中的一篇内存优化。
请问其中的inflater 是指什么东西啊?我新手,不懂哦
if (convertView == null) {
System.out.println("convertView "+convertView);
你这样写每次判断为空的时候才会输出,建议你吧输出语句放到最后