Android 中ListView 缓存机制

在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;
        }

这样就不需要每次都查找了。

你可能感兴趣的:(Android 中ListView 缓存机制)