天天看點

一起Talk Android吧(第七十五回:Android中UI控件之ListView優化)

各位看官們,大家好,上一回中咱們說的是Android中UI控件之

ListView

擴充的例子,這一回咱們說的例子是UI控件之

ListView

優化。閑話休提,言歸正轉。讓我們一起Talk Android吧!

看官們,我們都知道

ListView

是用來顯示大量資料的控件,如果資料量太大了,效率就會非常的低,是以,我們非常有必要對

ListView

進行相關的優化。下面我們通過代碼結合文字的方式來說明:如何優化

ListView

控件

public class DIYAdapter extends ArrayAdapter<DataType>{
        private int itemId;
        public DIYAdapter(Context context, int textViewId, List<DataType> dataTypeList){
            super(context,textViewId,dataTypeList);
            itemId = textViewId;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            DataType itemData = getItem(position);
            ViewHolder viewHolder;
            View view;
            //View view = LayoutInflater.from(getContext()).inflate(itemId,parent,false);
            if(convertView != null) {
                view = convertView;
                viewHolder = (ViewHolder)view.getTag();
            }else {
                view = LayoutInflater.from(getContext()).inflate(itemId,parent,false);
                ImageView imageView = (ImageView)view.findViewById(R.id.list_item_image);
                TextView textView = (TextView)view.findViewById(R.id.list_item_text);
                viewHolder = new ViewHolder(imageView,textView);
                view.setTag(viewHolder);
            }
            viewHolder.mImageView.setImageResource(itemData.getImageId());
            viewHolder.mTextView.setText(itemData.getTitle());
//            ImageView imageView = (ImageView)view.findViewById(R.id.list_item_image);
//            TextView textView = (TextView)view.findViewById(R.id.list_item_text);
//            imageView.setImageResource(itemData.getImageId());
//            textView.setText(itemData.getTitle());

            return  view;
        }

        public class ViewHolder {
            private ImageView mImageView;
            private TextView mTextView;

            public ViewHolder(ImageView img, TextView text){
                mImageView = img;
                mTextView = text;
            }
        }
    }
           

看官們,優化的地方主要是擴充卡,大家重點看一下上面的代碼中注釋掉的代碼,這些代碼就是被優化掉的代碼。

  • 第一個優化的地方是關于view的

    優化前每次都要擷取view,優化後隻有在第一次加載布局時擷取view。那麼如何判斷是第一次加載布局呢?這個取決于

    getView

    的第二個參數,第一次加載布局的時候它是空的,以後ListView就會把加載好的布局緩沖起來,每次調用

    getView

    方法時,它會把緩沖的布局傳遞給第二個參數。
  • 優化的第二個地方是關于布局中的控件

    優化前我們每次都要去擷取布局中的控件,優化後我們隻需要在第一次加載布局時擷取布局中的控件。這是如何實作的呢?我們使用了緩沖的技術,首先定義了緩沖類

    ViewHolder

    。類中的資料成員需要與布局檔案中的控件相對應。我們在第一次加載布局的時候初始化一個緩沖類對象,并且使用

    view.setTag()

    方法把該對象存放到View中。以後隻需要使用

    view.getTag()

    方法就可以擷取到被緩沖的對象。

看官們,對

ListView

的優化主要使用了緩沖思想,這想可以大提高

ListView

的運作效率,在資料量小的時候可能展現不出來優化的好處,在資料量大的時候就可以展現出來了。是以,希望大家在使用

ListView

的時候能夠進行優化。

各位看官,關于Android中UI控件之

ListView

優化的例子咱們就介紹到這裡,欲知後面還有什麼例子,且聽下回分解!