Android學習筆記————提高列表的流暢性

來源:互聯網
上載者:User

本文來自本人Android學習的體會和總結,轉載請申明出處:http://blog.csdn.net/chenshaoyang0011

Android平台中,列表是使用最頻繁的組件之一,列表設計的好壞能夠直接影響使用者的體驗。試想,如果你在滑動一個ListView的時候總是感到卡頓,你一定會覺得這個應用是個再糟糕不過的應用了。

那麼今天我們就來討論下,如何使列表更加的流暢性?本文參考自:http://developer.android.com/training/improving-layouts/smooth-scrolling.html#

好了,言歸正傳。為了打到最佳化的目的,我們可以通過:重複利用資源來打到我們的目的

首先,我們需要明白一個事實,在列表中(如ListView,GridView等)中,顯示多個item,而且通常情況下,每個item的布局是一樣的。這裡就牽扯到我們討論的問題,重複利用資源。想要打到這個目的,我們首先需要明白Android中用於列表中的適配器(Adapter)是如何工作的,如,SimpleAdapter,CursorAdapter,ArrayAdapter這些都是系統為我們設計好的,當然也是最佳化過的。但通常我們需要使用自己設計的適配器,關於適配器的使用,可以參考逼人的另外一篇筆記:http://blog.csdn.net/chenshaoyang0011/article/details/6978036,這裡就不再贅述了。

列表中最需要回收的資源是什嗎?當然是Item中共同擁有的或具有非常相似的東西,這其中最常見的當然是View了(用於顯示每個item的容器)。如果我們為每個Item都建立自己的View,勢必會消耗更多的資源,此時我們不妨利用前面不用的View,來顯示自己的內容。而Adapter中與View直接相關的方法就是getView了,其中有三個參數,分別是

int position 當前item的位置(從0起)

 View convertView用於回收利用的View,如果沒有就為null

 ViewGroup parent當前View所屬的父View

那麼,我們現在需要瞭解的是convertView是如何用於回收的呢?

當列表第一次被建立的時候,所有的convertView 都是null

當我們滑動列表時,我們就會將不再顯示的item進行回收,用與建立那些需要顯示的item。

注意,只有當item徹底離開螢幕才會將其回收。

這樣,我們知道convertView是如何被回收的,接下來的事就是按照這個思路寫code啦。下面就是一個簡單的demo,示範一種可供使用的回收方式。

public class MyAdapter extends BaseAdapter {        private Context mContext;    private LayoutInflater inflater;    private List<Integer> ls = new ArrayList<Integer>();        public MyAdapter(Context context,List<Integer> list){        this.mContext = context;        inflater = LayoutInflater.from(context);        ls = list;    }    @Override    public int getCount() {        return (ls == null)? 0: ls.size();    }    @Override    public Object getItem(int arg0) {        return (ls == null) ? null : ls.get(arg0);    }    @Override    public long getItemId(int arg0) {        return arg0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {                ViewHolder holder;                if(convertView == null){            convertView = inflater.inflate(R.layout.list_item, null);            holder = new ViewHolder();            holder.tv = (TextView)convertView.findViewById(R.id.textView);                        //通過setTag,將其交給convertView,並通過convertView“郵寄”給需要的item            convertView.setTag(holder);        }else{                        //收到郵件,拿來自己用            holder = (ViewHolder)convertView.getTag();        }                holder.tv.setText(ls.get(position) + "");                return convertView;    }        /**     * 這個類用於持有item中擁有的子View,     * 以及其他可以傳遞的具有共性的東西     */    static class ViewHolder{        TextView tv;    }}

代碼很簡單,只需要注意ViewHolder的使用就可以啦。

那麼至此,我們就能夠通過回收View來最佳化列表啦。

如有錯誤,歡迎指正~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.