• ListView优化的代码


    第三种ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。

    当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。(看下面代码中)

    如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。

     

    //在外面先定义,ViewHolder静态类
    static class ViewHolder
    {
        public ImageView img;
        public TextView title;
        public TextView info;
    }
    //然后重写getView
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if(convertView == null)
            {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.list_item, null);
                holder.img = (ImageView)item.findViewById(R.id.img) 
                holder.title = (TextView)item.findViewById(R.id.title);
                holder.info = (TextView)item.findViewById(R.id.info);
                convertView.setTag(holder);
            }else
            {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.img.setImageResource(R.drawable.ic_launcher);
            holder.title.setText("Hello");
            holder.info.setText("World");
                 
            return convertView;
        }

    到这里,可能会有人问ViewHolder静态类结合缓存convertView与直接使用convertView有什么区别吗,是否重复了

    在这里,官方给出了解释

    提升Adapter的两种方法

    To work efficiently the adapter implemented here uses two techniques:
    -It reuses the convertView passed to getView() to avoid inflating View when it is not necessary

    (译:重用缓存convertView传递给getView()方法来避免填充不必要的视图)
    -It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary

    (译:使用ViewHolder模式来避免没有必要的调用findViewById():因为太多的findViewById也会影响性能)
    ViewHolder类的作用
    -The ViewHolder pattern consists in storing a data structure in the tag of the view
    returned by getView().This data structures contains references to the views we want to bind data to,
    thus avoiding calling to findViewById() every time getView() is invoked

    (译:ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构,这个数据结构包含了指向我们

    要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById())

  • 相关阅读:
    HTML和CSS
    springcloud中配置多数据源
    洛谷 P3800 Power收集(单调队列优化dp)
    洛谷 P2569 [SCOI2010]股票交易(单调队列优化dp)
    洛谷 P3957 [NOIP2017 普及组] 跳房子(二分,单调队列优化dp)
    洛谷 P1419 寻找段落(01分数规划,实数二分,单调队列)
    Prometheus(普罗米修斯)和grafana监控的安装和使用
    AMC如何管理NPL
    linux 正则表达式与字符处理
    react-router-dom switch & match
  • 原文地址:https://www.cnblogs.com/zhoujn/p/4108747.html
Copyright © 2020-2023  润新知