Android UI基础——ListView性能优化ViewHolder

其实上一篇文章中我们ListView的运行效率非常低,因为在Adapter中的getView()方法中每次都会将布局加载一遍,当ListView的item很多的时候,想要完成快速滚动是不可能的,所以可以借助一个ViewHodler进行性能的优化。
这部分代码是在Adapter中实现的,新建一个内部类ViewHolder,用于控件的缓存,当convertView为空时,创建一个ViewHolder的对象,将所有控件放入ViewHolder中,然后调用setTag(),将ViewHolder对象放在View中,如果convertView不为空,调用getTag()方法,从View中把ViewHolder对象取出来,这样实际的效果是只有第一次进入页面可看见的ListView的item是新建的,其他往下滑动出现的item都是取之前的,具体代码如下:

public class SportListAdapter extends BaseAdapter{
    private List list;//此处的泛型是我自己定义的一个类,提供了三个属性
    private Context mContext;

    public SportListAdapter(List list, Context mContext) {
        this.list = list;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
     /**
         * ViewHolder性能优化写法
         */
        ViewHolder holder;//初始化MyViewHolder
        if (convertView == null){
            holder = new ViewHolder();//实例化对象
            convertView = LayoutInflater.from(mContext).inflate(R.layout.sport_list_item,null);//自定义设置布局
            holder.mImageView = (ImageView) convertView.findViewById(R.id.sport_list_image);//给布局中的控件绑定id
            holder.mTextView_1 = (TextView) convertView.findViewById(R.id.sport_list_text_1);
            holder.mTextView_2 = (TextView) convertView.findViewById(R.id.sport_list_text_2);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        SportsNews sportsNews = list.get(position);
        holder.mImageView.setImageResource(sportsNews.getPhoto());
        holder.mTextView_1.setText(sportsNews.getTitle());
        holder.mTextView_2.setText(sportsNews.getContent());
        return  convertView;
    }
    //内部类ViewHolder
    class ViewHolder{
        ImageView mImageView;
        TextView mTextView_1;
        TextView mTextView_2;
    }
}

你可能感兴趣的:(Android,UI)