溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

BaseAdapter的使用及優(yōu)化

發(fā)布時間:2020-07-19 19:43:35 來源:網(wǎng)絡 閱讀:438 作者:許大蟲 欄目:開發(fā)技術

    ListView在安卓開發(fā)中,是經(jīng)常需用使用的控件,而用這個控件,就離不開它的數(shù)據(jù)綁定,這時候Adapter(數(shù)據(jù)適配器)就起了很大作用     

    在學習了多種Adapter(適配器之后),感覺比較常用的三種就是ArrayAdapter和SimpleAdapter以及BaseAdapter.

    ArrayAdapter用法最為簡單,但功能較為單一,一般只能顯示簡單的文本信息。

    SimpleAdapter有所提升,能通過自己編寫一個布局來顯示圖像和文本,但缺點在于模板單一,只能使用固定的1個模板

    而BaseAdapter(基礎適配器)則最為自由,可以通過重寫方法來實現(xiàn)自己想要的各種的布局,但是難度較大,接下來將淺談一下自己對BaseAdapter的使用及優(yōu)化方法。

  1. 要使用BaseAdapter,先寫一個class類繼承BaseAdapter,并實現(xiàn)其方法,方法如下BaseAdapter的使用及優(yōu)化

  2. getCount()為獲取數(shù)據(jù)條目的數(shù)量,返回值也就是數(shù)據(jù)條目的數(shù)量(這個返回值數(shù)據(jù)條目的數(shù)量一定要寫)、getItem()為獲取對應ID項對應的Item(可以不用管)、getItemId()為獲取對應項ID(也可以不用管),最后一個方法最為重要也就是getView(int position,View covertView,ViewGroup arg2),重寫的主要是這個方法

  3. 事先準備如下BaseAdapter的使用及優(yōu)化其中context為上下文,List<...>集合可以根據(jù)自己需要用泛型來規(guī)定自己的數(shù)據(jù),這里只是簡單例子

  4. 接下來就開始重寫getView(...)方法,步驟主要分為:BaseAdapter的使用及優(yōu)化

  5. 第一種寫法:

          // 獲取納秒時間 更加精確

            long start = System.nanoTime();

      // 由于我們只需要將XML轉化為View,并不涉及到具體的布局,所以第二個參數(shù)通常設置為null

           LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflater.inflate(R.layout.item, null);

            // 實例化控件(這些控件為自己在根據(jù)需要在布局中加的控件)

            ImageView itemImage = (ImageView) view.findViewById(R.id.iv_p_w_picpath);

            TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);

            TextView itemContent = (TextView) view.findViewById(R.id.tv_content);

            // 取出contact對象

            Contact contact = contacts.get(position);

            // 設置控件的數(shù)據(jù)

            itemImage.setImageResource(contact.itemImageResid);

            itemTitle.setText(contact.itemTitle);

            itemContent.setText(contact.itemContent);

            //記錄時間

            long end = System.nanoTime();

            long dValue = end - start;

            mSumTime += dValue;

            // 輸出每次getView消耗的時間和

            Log.d("ATG", String.valueOf(mSumTime));

            return view;

    這種方法最基礎,也最耗時,原因是函數(shù)沒被調(diào)用一次,所有步驟都要執(zhí)行一次,實際上有些步驟或控件是可以重用的。

  6. 第二種改良方法:

    // 獲取納秒時間 更加精確

    //        long start = System.nanoTime();

    //        當?shù)谝淮握{(diào)用該方法是,才需要將布局模塊轉為View對象,其它時候不需要了

    //        if (convertView == null) {

    //           LayoutInflater inflater = LayoutInflater.from(context);

    //          convertView = inflater.inflate(R.layout.item, null);

    //        }

    //        ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);

    //        TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);

    //        TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);

    //        // 取出contact對象

    //        Contact contact = contacts.get(position);

    // 設置控件的數(shù)據(jù)

    //        itemImage.setImageResource(contact.itemImageResid);

    //        itemTitle.setText(contact.itemTitle);

    //        itemContent.setText(contact.itemContent);

    //        long end = System.nanoTime();

    //        long dValue = end - start;

    //        mSumTime += dValue;

    // 輸出每次getView消耗的時間和

    //        Log.d("ATG", String.valueOf(mSumTime));

    //        return convertView;

        這種方法將無謂的重復的吧布局模塊轉為View對象的步驟簡化

  7. 第三種方法:

    // 獲取納秒時間 更加精確

    //        long start = System.nanoTime();

    //        ViewHolder holder = null;

    //        if (convertView == null) {

    //            holder = new ViewHolder();

    //            LayoutInflater inflater = LayoutInflater.from(context);

    //            convertView = inflater.inflate(R.layout.item, null);

    //            holder.img = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);

    //            holder.title = (TextView) convertView.findViewById(R.id.tv_title);

    //            holder.content = (TextView) convertView.findViewById(R.id.tv_content);

    //            convertView.setTag(holder);

    //        } else {

    //            holder = (ViewHolder) convertView.getTag();

    //        }

    // 取出contact對象

    //        Contact contact = contacts.get(position);

    // 設置控件的數(shù)據(jù)

    //        holder.img.setImageResource(contact.itemImageResid);

    //        holder.title.setText(contact.itemTitle);

    //        holder.content.setText(contact.itemContent);

    //        long end = System.nanoTime();

    //        long dValue = end - start;

    //        mSumTime += dValue;

    // 輸出每次getView消耗的時間和

    //        Log.d("ATG", String.valueOf(mSumTime));

    //        return convertView;

        }

        // ViewHolder用于緩存控件

        class ViewHolder{

            public ImageView img;

            public TextView title;

            public TextView content;

        }

    這種方法將初始化控件也設置在了只在第一次調(diào)用時使用,這用就避免了多次尋找控件初始化的操作,這種方法是這三種方法中優(yōu)化效果最好,也最推薦使用,因為當運行程序較大時,每一步的優(yōu)化都尤為關鍵。

  8. 然后就是創(chuàng)建適配器ContactAdapter contactadapter = new ContactAdapter(this, contacts);

  9. 最后就是將ListView控件加載到適配器中l(wèi)istView.setAdapter(contactadapter);

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI