免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

androidListView詳解

    在android開發中ListView是非常重要的控件。我自己也還是一個小白,把自己的學習經驗分享出來,希望可以幫到初學Android的朋友們。這也是我第一次寫博客,我盡量將結構處理的好一些,也說的易懂一些。如果寫得不好或者有誤,請指正見諒!

站在用戶的角度思考問題,與客戶深入溝通,找到瑞安網站設計與瑞安網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創造個性化、用戶體驗好的作品,建站類型包括:網站設計制作、網站設計、企業官網、英文網站、手機端網站、網站推廣、國際域名空間、網站空間、企業郵箱。業務覆蓋瑞安地區。

    

簡介

    ListView特性是批量展示結構一樣或者相似的信息并且可以滑動展示。ListView是一個組合控件,組合控件和普通控件的區別在于:

    普通控件:內容和控件是一起的。
    組合控件:內容跟控件是分開的。

    所以使用ListView的時候要用到適配器,那什么是適配器呢,官方文檔的解釋是控件與數據之間的一個橋梁。如果不好理解,不要糾結,用多了自然就明白了。ListView作為一個整體的框架,而適配器則決定每一行上的內容是什么:


    ListView     框架

    適配器       內容

使用

    簡單介紹過ListView之后,我們來說下ListView的使用。

    1、在Activity的布局文件中放入Listview,注意listview的高度要是match_parent 或者是固定值,這里不建議使用wrapcontent,因為這樣會有requestLayout的操作,對性能有損耗。

    2、準備好listview的行布局文件listview_item,作為listview每一行的顯示樣式。

    3、準備listview的適配器,聲明一個類繼承BaseAdpater,實現四個方法:

       //這個方法決定了listview顯示內容的行數

       public int getCount() 

       //決定listview每一行的布局以及內容,position代表是listview上面的行號。

       public View getView(int position, View convertView, ViewGroup parent)

       注意:·listview上的每一行要顯示在界面上都必須調用getView()

             ·每一個已經消失在屏幕上的行,重新顯示在界面都必須重新調用getView()

            ·如果getCount() 返回的結果為0的話,是不會調用getView()

    4、getView()中每一行的布局創建以及內容設置

               //獲取行布局對象(通過解析行布局文件)

          LayoutInflater inflater = getLayoutInflater();//得到布局轉換器

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

        //通過布局對象查找它里面控件的索引 (一定要通過行布局對象查找)很多初學者在使用ListView的時候很容易報空指針錯誤,就是這個原因。

          TextView textView =(TextView)layout.findViewById(R.id.tv_list_item);

        //通過行號查找容器里面對應的內容

          String string = arrayList.get(position);

        //把內容設置到布局對象里面的控件對象上面

          textView.setText(string);

        //返回行布局對象(而不是里面某個控件)

          return layout;

 

    5、查找Listview控件對象

        ListView listView = (ListView) findViewById(R.id.listView1);

    

    6、創建一個適配器對象

          MyAdapter adapter = new MyAdapter();

    7、為listview配置適配器(如果沒有配置,listview里面是沒有內容的)

          listView.setAdapter(adapter)

    這里再說明一下,行布局為多個控件,就是之前創建的listview_item,每一行都是listview_item。還要注意的是每行數據都要封裝到同一個對象當中,比如都是將數據設置到listview_item里的textview上,這里再重申一遍,每一個控件的索引都必須通過行布局對象去查找。(否則就為null,運行時會報空指針異常)。

優化   

    講完ListView的使用后,講一下ListView的優化。 

    1、復用行布局

    為什么要優化ListView呢,因為上面的寫法,每一次getView()的時候都創建一個新的行布局對象,又因為Android的垃圾回收機制是不定時回收的,當數據比較多的時候,你上下滑動,ListView就不斷的創建對象,輕則會造成卡頓,重則就內存溢出了。其實我們知道,如果屏幕上可以顯示6行,我們準備7個布局對象就可以。如果不明白的童鞋可以想象一下,就像戲臺上演行軍并不需要那么多人,只要讓前面走出戲臺的人再從后面接上來就可以了。

    復用行布局:

    public View getView(int position, View convertView, ViewGroup parent) 

    {

      View layout = null;

    

      if(convertView == null)

      {

       LayoutInflater inflater = getLayoutInflater();//得到布局轉換器

          layout = inflater.inflate(R.layout.list_item, null);

      }else

      {

       layout = convertView;

      }

    return layout;

    }

    說明: convertView用來保存已經創建并且消失在界面的那個行布局對象的索引。初始為null,當行布局對象消失的時候才有值

    2、減少查找次數

    基于復用行布局的基礎上,如果每一次getView(),都要再去找行布局上的控件也是很麻煩的,因為既然是復用,之前肯定是已經找過了。這里的優化方法如下:

    聲明一個類,類里面的成員變量即為 行布局里面的 控件類型   

   a、class ViewHolder

    {

    //將行布局內的控件申明為該類的成員變量

         ImageView p_w_picpathView;

         TextView title;

         TextView subTitle;

     }

   b、在getVIew中

        public View getView(int position, View convertView, ViewGroup parent) 

    {

      View layout = null;

      ViewHolder holder = null;

      if(convertView == null)

      {

       holder = new ViewHolder();

       LayoutInflater inflater = getLayoutInflater();//得到布局轉換器

       layout = inflater.inflate(R.layout.list_item, null);

       holder.p_w_picpathView = (ImageView) layout.findViewById(R.id.iv_list);

       holder.title = (TextView) layout.findViewById(R.id.tv_list_item);

       holder.subTitle = (TextView) layout.findViewById(R.id.tv_list_sub);

       //標簽(口袋)

       layout.setTag(holder);

      }else

      {

       layout = convertView;

       //如果convertView不為空,得到holder,然后得到行布局內控件的引用。

       holder = (ViewHolder) layout.getTag();

      }

    當然ListView的優化在實際的項目開發中在數據請求的過程中會有一些bug,這里以后再說明解決。

數據的更新

    //通知適配器內容發生改變,更新界面

      adapter.notifyDataSetChanged();

lisetview 行點擊事件

    1、設置行點擊事件

    listView.setOnItemClickListener(new OnItemClickListener() {

   @Override

   public void onItemClick(AdapterView parent, View view,

     int position, long id) {

    Log.e("onItemClick", "position:" + position);

   }

  });

    2、長按彈出選項菜單

   //為listview注冊上下文菜單

    registerForContextMenu(listView);

   //長按事件

    listView.setOnItemLongClickListener(new OnItemLongClickListener() {

   @Override

    public boolean onItemLongClick(AdapterView parent, View view,

     int position, long id) {

    Log.e("onItemLongClick", "position:" + position);

    MainActivity.this.position = position;

    return false;   (返回false的時候事件還會向下傳遞,返回true就到此結束)

   }

  });

    當然還需重寫onCreateContextMenu和onContextItemSelected方法。listvew長按彈出選項菜單還有另一種方法:   

    listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

    // @Override

    public void onCreateContextMenu(ContextMenu menu, View v,

    ContextMenuInfo menuInfo) {

    

    }

  });

總結

   好了,ListView就講到這里了,當然要做出漂亮的listview還沒那么簡單,這些可能會在后面的博客中說道,希望這篇博客對大家有所幫助,謝謝!

分享文章:androidListView詳解
瀏覽路徑:http://m.newbst.com/article10/pjdego.html

成都網站建設公司_創新互聯,為您提供全網營銷推廣、網站收錄、商城網站域名注冊面包屑導航定制網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設