ListView用法總結


  前言

  列表,它作為一種非常重要的顯示形式,不管是在web端還是在移動平台上,都是一種非常友好的,功能強大的展現形式。在Android中,ListView就接管了這一重任。盡管在Android5.X時代,后起之秀RecyclerListView在很多地方會取代ListView。但這依然無法撼動ListView這個老大哥的地位。既然,ListView這么重要,我看十分有必要對ListView的用法做一個總結。

  正文

  我這里總結為9大點,聽我細細給您道來。

  Ⅰ、使用ViewHolder提高效率

  利用ViewHolder來提高ListView的執行效率是有目共睹的,ViewHolder模式是充分利用ListView的View視圖緩存機制,避免了ListView每次調用getView的時候,都需要調用getView方法,極大提升了ListView的運行效率,據說,這種方式能提升效率50%以上。下面,我通過具體的代碼講解這種用法。ViewHolder代碼如下:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        // 判斷是否緩存
        if (convertView == null) {
            holder = new ViewHolder();
            // 通過LayoutInflater實例化布局
            convertView = mInflater.inflate(R.layout.notify_item, null);
            holder.img = (ImageView) convertView.findViewById(R.id.imageView);
            holder.title = (TextView) convertView.findViewById(R.id.textView);
            convertView.setTag(holder);
        } else {
            // 通過tag找到緩存的布局
            holder = (ViewHolder) convertView.getTag();
        }
        // 設置布局中控件要顯示的視圖
        holder.img.setBackgroundResource(R.drawable.ic_launcher);
        holder.title.setText(mData.get(position));
        return convertView;
    }

    public final class ViewHolder {
        public ImageView img;
        public TextView title;
    }

  輕輕松松進行視圖的緩存,提高了運行效率。運行效果為:

  Ⅱ、設置條目間分隔線

  在Android系統提供了divider(分割線背景值)與dividerHeight(分割線)屬性來設置兩個條目之間的分割線。例如我用下述代碼就能夠起到分割相鄰條目的功能:

  android:divider="@android:color/darker_gray"
        android:dividerHeight="10dp"

  運行效果為:

  Ⅲ、隱藏ListView滾動條

  當我們上滑下拉ListView時候,在右邊的邊緣都會出現滾動條顯示您滾動的位置,當我們把scrollbars屬性設置為none的時候,你再滾動listview的時候,再也不會出現滾動條。

  Ⅳ、取消ListView的點擊效果

  當您點擊ListView時候,系統會加上一個默認的點擊效果。如果您想自定義的話只需要設置listSelector="xxx"之后,這樣條目點擊以后,就能變成您想要的效果。

  Ⅴ、設置ListView需要顯示第幾項

  ListView是以條目的形式來顯示,默認是顯示第一個條目。當你要顯示具體的某個條目時,只需要調用setSelection(n)就可以,這個效果是瞬時完成的。

  Ⅵ、動態修改ListView

  當listView的綁定的數據發生了改變的改變,我們當然可以通過重新設置adapter來,來重新獲取一下數據。這樣的用戶體驗很不友好啊,而且執行的效率非常的底下。其實,我們殺雞焉用牛刀,只需要調用adapter.notifyDataChanged()就可以,實現ListView動態更新。但這有一個前提,就是必須保證傳遞數據對象是一樣的。請看代碼:

mData.add("new");
        mAdapter.notifyDataSetChanged();

  這樣就能實現ListView數據動態更新。運行效果如下:

 

  Ⅶ、遍歷ListView所有item

  Android常見操作方法就是遍歷ListView中所有條目,相應代碼為:

for (int i = 0; i < mListView.getChildCount(); i++) {
            View view = mListView.getChildAt(i);
        }

  Ⅷ、處理空ListView

  ListView,本質是呈現數據列表的載體,當沒有數據的展示的時候,根據良好的用戶體驗的設計規范,應該給予用戶適當的提示,Android系統提供了setEmptyView()方法,當無數據時候,給予用戶友好的提示。

     Ⅸ、ListView滑動監聽

  對ListView的滑動監聽,這是一個重要的技巧,看來我們有必要在這里下一番寒徹骨 。我們在這里主要是兩個事件監聽——OnTouchListener事件與OnScrollListener事件。

  ①、OnTouchListener事件

  OnTouchListener是View自帶的監聽事件,我們一般監聽ACTION_DOWN(按下狀態),ACTION_UP(抬起狀態)與ACTION_MOVE(移動狀態)三個狀態的坐標,就能夠判斷ListView是上滑還是下滑。相應事件如下:

  View.OnTouchListener myTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_MOVE:
                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }
            return false;
        }
    };

  ②、OnScrollListener事件

  OnScrollListener事件是ListView自帶的事件,他封裝了很多與ListView相關信息,用起來十分靈活。我們來看看它的使用方法。代碼如下:

     mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState){
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                        break;
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });

  我們觀察這個OnScrollListener事件中有兩個回調方法——OnScrollStateChanged()和OnScroll()。

  我們來看看第一個方法OnScrollStateChanged(),這個方法根據scrollState(滾動狀態)來確定其回調的次數。其中ScrollState有三種模式:

  OnScrollListener.SCROLL_STATE_IDLE——滾動停止時。

  OnScrollListener.SCROLL_STATE_TOUCH_SCROLL——正在滾動時。

  OnScrollListener.SCROLL_STATE_FLING——手指用力滾動時,即用戶離開以后,即ListView由於慣性會繼續滾動一段時間。

  當用戶用力滾動時,這個方法會回調3次,否則的話,只會回調2次。主要差別在於,是否觸發了這個用力滾動事件。我們對這個方法的一般的做法在於,設置一些標志Flag,來處理不同的狀態,供其他方法處理。

  下面再來看看onScroll()這個回調方法,他在ListView滾動時一直回調,我們要了解其他三個參數

  firstVisibleItem——當前能看見的第一個Item的ID。

  visibleItemCount——當前能看見的Item的總數。

  totalItemCount——整個ListView的Item條目的數目。

  需要指出的是,當前能看見的Item,包括沒有顯示完整的Item。通過這幾個參數,可以做一些有用的判斷,即可以判斷這個ListView是否滾動到最后一行。判斷思路在於當前可視的Item的ID加上當前可視Item的和是否等於Item的總數.也可以判斷滾動方向,判斷第一個Item的ID是否大於上次第一個可見ItemID。

  總結

  ListView使用方法,就是上面總結"九宗罪",希望給大家有幫助。本人才疏學淺,希望大家吐槽。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM