zoukankan      html  css  js  c++  java
  • listview优化几种写法(原创)

     这篇文章只是总结下getView里面优化视图的几种写法,就像孔乙己写茴香豆的茴字的几种写法一样,高手勿喷,勿笑,只是拿出来分享,有错误的地方欢迎大家指正,谢谢。     

    listview

          A view that shows items in a vertically scrolling list    。一个显示一个垂直的滚动子项的列表视图

         在android开发中,使用listview的地方很多,用它来展现数据,成一个垂直的视图。使用listview是一个标准的适配器模式,用数据--,界面--xml以及适配器--adapter,数据被适配器按照需要的方式展现出来,xml描写了数据如何展现,activity中控制这些活动。

          其中使用自定义的adapter,会要重写getView方法,在getView方法产生给用户item的视图以及数据。

      见图:

      

          这里有一个优化的地方,就是重用view,这样减少内存消耗,同时加快item加载速度。

          在getView中优化的地方,大家想必都非常情况,下面我总结了三种优化的写法,请大家指正。

          第一:

         重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。

         特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。

    View Code
    public View getView(int position, View convertView, ViewGroup parent)
        {
            if (convertView == null)
            {
                convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1, null);
            }
            TextView tv_name =  (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);
            TextView tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
            ContactInfo1 confo =  contacts.get(position);
            if (confo != null) {//to set every item's text
                
                tv_name.setText(confo.getContactName());
                tv_phone.setText(confo.getContact_Phone());
            }
            return convertView;
       
        }

         第二:

         上面的写法会有一个缺点,就是每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情,因为的geiview中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。

        下面给出第二种写法

         写发的特点,通常有一个内部类class ViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。同时重用了convertView,很大程度上的减少了内存的消耗。

    View Code
     public View getView(int position, View convertView, ViewGroup parent)
        {
            ViewHolder holder ;
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1, null);
                holder = new ViewHolder();
                holder.tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);
                holder.tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
                convertView.setTag(holder);
            }
            else
            {
                holder = (ViewHolder)convertView.getTag();
            }
            ContactInfo1 confo =  contacts.get(position);
            Log.i("my", "confo "+confo.getContactName());
            if (confo != null) {//to set every item's text
                 
               
                holder.tv_name.setText(confo.getContactName());
                holder.tv_phone.setText(confo.getContact_Phone());
                
            }
            return convertView;
        
        }
        class ViewHolder
        {
            TextView tv_name,tv_phone;
            
        }

        第三:
      个人觉得这个写法是最舒服的,最舒服的意思是看着代码有一种很爽,看的很清晰。

        特点,使用了内部类class ViewHolder、重用了convertView。

        区别第二种写法是,使用了一个临时变量View view = convertView,然后修改view,最后返回view

    View Code
     @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
          View view = convertView;
          ViewHolder holder ;
          if (view == null) {
              view = LayoutInflater.from(context).inflate(R.layout.section_list_item1, null);
              holder = new ViewHolder();
              holder.tv_name = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name);
              holder.tv_phone = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
              view.setTag(holder);
          }
          else
          {
              holder = (ViewHolder)view.getTag();
          }
          ContactInfo1 confo =  contacts.get(position);
          Log.i("my", "confo "+confo.getContactName());
          if (confo != null) {//to set every item's text
               
             
              holder.tv_name.setText(confo.getContactName());
              holder.tv_phone.setText(confo.getContact_Phone());
              
          }
          return view;
        }
        class ViewHolder
        {
            TextView tv_name,tv_phone;
            
        }

      以上就是集中写法,供新手学习和总结。

    源代码如下:LisViewTest.zip

     根据楼下朋友提供的建议,发现还有优化的地方,最新更新如下:    

          

    View Code 
     
    @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
          View view = convertView;
          ViewHolder holder ;
          if (view == null) {
              view = LayoutInflater.from(context).inflate(R.layout.section_list_item1, null);
              holder = new ViewHolder();
              holder.tv_name = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name);
              holder.tv_phone = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
              view.setTag(holder);
          }
          else
          {
              holder = (ViewHolder)view.getTag();
          }
          ContactInfo1 confo =  contacts.get(position);
          Log.i("my", "confo "+confo.getContactName());
          if (confo != null) {//to set every item's text
                
              
              holder.tv_name.setText(confo.getContactName());
              holder.tv_phone.setText(confo.getContact_Phone());
               
          }
          return view;
        }
       <font color="\"#0000ff\""> </font>static class ViewHolder
        {
            TextView tv_name,tv_phone;
             
        }

     注意:static class ViewHolder
         这里设置ViewHolder 为static,也就是静态的,静态类只会在第一次加载时 会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。
         非常感谢大家提出建议以及大家的关注!

       

  • 相关阅读:
    POJ 2240 Arbitrage spfa 判正环
    POJ 3259 Wormholes spfa 判负环
    POJ1680 Currency Exchange SPFA判正环
    HDU5649 DZY Loves Sorting 线段树
    HDU 5648 DZY Loves Math 暴力打表
    HDU5647 DZY Loves Connecting 树形DP
    CDOJ 1071 秋实大哥下棋 线段树
    HDU5046 Airport dancing links 重复覆盖+二分
    HDU 3335 Divisibility dancing links 重复覆盖
    FZU1686 神龙的难题 dancing links 重复覆盖
  • 原文地址:https://www.cnblogs.com/xilinch/p/2760233.html
Copyright © 2011-2022 走看看