在iOS中UITableView的cell用Identifier缓存,方法如下:
dequeueReusableCellWithIdentifier:
在Android中也有类似的方法。
public View getView(int position, View convertView, ViewGroup parent)
Android中通过上面的方法返回每个item的view,这个convertView就是缓存的view。
所以在方法里面就需要判断是否有缓存:
View view = null;
if (convertView == null) {
view = View.inflate(getContext(), R.layout.item_music, null);
} else {
view = convertView;
}
return view;
但是Android中通过XML获取item中的每个组件,需要使用方法findViewById:。
不过findViewById方法是通过树查找来寻找组件的,这样就会比较耗费资源,这样就需要用ViewHolder。
直接上代码:
static class ViewHolder {
TextView tvRow;
TextView tvName;
TextView tvSinger;
ImageButton ibDelete;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(getContext(), R.layout.item_music, null);
holder = new ViewHolder();
holder.tvRow = convertView.findViewById(R.id.tvMusicRow);
holder.tvName = convertView.findViewById(R.id.tvMusicName);
holder.tvSinger = convertView.findViewById(R.id.tvMusicSinger);
holder.ibDelete = convertView.findViewById(R.id.ibDelete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (CollectionUtils.getSize(dataArray) < position) {
return convertView;
}
AiEntityBean.MusicInfo musicInfo = dataArray.get(position);
holder.tvRow.setText(String.format(Locale.getDefault(), "%1$d", position + 1));
holder.tvName.setText(musicInfo.getSongName());
String singer = "-";
for (String singleSinger : musicInfo.getSinger()) {
singer = singer.concat(singleSinger);
singer = singer.concat(" ");
}
holder.tvSinger.setText(singer);
holder.ibDelete.setTag(musicInfo);
holder.ibDelete.setOnClickListener(deleteOnClickListener);
return convertView;
}
这样就不需要每次都查找了。