国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android ListView詳解

移動開發 Android
在Android開發中ListView是比較常用的組件,它以列表的形式展示具體內容,并且能夠根據數據的長度自適應顯示。實例如下。

在Android開發中ListView是比較常用的組件,它以列表的形式展示具體內容,并且能夠根據數據的長度自適應顯示。抽空把對ListView的使用做了整理,并寫了個小例子,圖示。

 列表的顯示需要三個元素

1.ListVeiw 用來展示列表的View。

2.適配器 用來把數據映射到ListView上的中介。

3.數據    具體的將被映射的字符串,圖片,或者基本組件。

根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

其中以ArrayAdapter最為簡單,只能展示一行字。SimpleAdapter有***的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對數據庫的簡單結合,可以方面的把數據庫的內容以列表的形式展示出來。

 我們從最簡單的ListView開始:

  1. view sourceprint?01 /**    
  2.   * @author allin    
  3.   **/   
  4. 05 public class MyListView extends Activity {       
  5.      private ListView listView;    
  6.      //private List<String> data = new ArrayList<String>();    
  7.     @Override   
  8.      public void onCreate(Bundle savedInstanceState){    
  9.          super.onCreate(savedInstanceState);    
  10.         listView = new ListView(this);    
  11.          listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,  
  12. getData()));    
  13.  
  14.          setContentView(listView);    
  15.     }    
  16.      private List<String> getData(){               
  17.          List<String> data = new ArrayList<String>();    
  18.         data.add("測試數據1");    
  19.          data.add("測試數據2");    
  20.         data.add("測試數據3");    
  21.          data.add("測試數據4");    
  22.          return data;    
  23.      }    
  24.  }   

上面代碼使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)來裝配數據,要裝配這些數據就需要一個連接ListView視圖對象和數組數據的適配器來兩者的適配工作,ArrayAdapter的構造需要三個參數,依次為this,布局文件(注意這里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系統定義好的布局文件只顯示一行文字,數據源(一個List集合)。同時用setAdapter()完成適配的***工作。運行后的現實結構如下圖:

 

#p#

SimpleCursorAdapter

sdk的解釋是這樣的:An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file. You can specify which columns you want, which views you want to display the columns, and the XML file that defines the appearance of these views。簡單的說就是方便把從游標得到的數據進行列表顯示,并可以把指定的列映射到對應的TextView中。

下面的程序是從電話簿中把聯系人顯示到類表中。先在通訊錄中添加一個聯系人作為數據庫的數據。然后獲得一個指向數據庫的Cursor并且定義一個布局文件(當然也可以使用系統自帶的)。

  1. view sourceprint?01 /**    
  2.   * @author allin    
  3.   **/   
  4.   public class MyListView2 extends Activity {      
  5.     private ListView listView;    
  6.      //private List<String> data = new ArrayList<String>();    
  7.      @Override   
  8.      public void onCreate(Bundle savedInstanceState){    
  9.         super.onCreate(savedInstanceState);             
  10.         listView = new ListView(this);    
  11.         Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);    
  12.          startManagingCursor(cursor);    
  13.          ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1,     
  14.                  cursor,    
  15.                  new String[]{People.NAME},     
  16.                new int[]{android.R.id.text1});               
  17.          listView.setAdapter(listAdapter);    
  18.          setContentView(listView);    
  19.      }     
  20.  }  

 Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);先獲得一個指向系統通訊錄數據庫的Cursor對象獲得數據來源。

 startManagingCursor(cursor);我們將獲得的Cursor對象交由Activity管理,這樣Cursor的生命周期和Activity便能夠自動同步,省去自己手動管理Cursor。

 SimpleCursorAdapter 構造函數前面3個參數和ArrayAdapter是一樣的,***兩個參數:一個包含數據庫的列的String型數組,一個包含布局文件中對應組件id的int型數組。其作用是自動的將String型數組所表示的每一列數據映射到布局文件對應id的組件上。上面的代碼,將NAME列的數據一次映射到布局文件的id為text1的組件上。

注意:需要在AndroidManifest.xml中如權限:<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

運行后效果如下圖:

SimpleAdapter

simpleAdapter的擴展性***,可以定義各種各樣的布局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復選框)等等。下面的代碼都直接繼承了ListActivity,ListActivity和普通的Activity沒有太大的差別,不同就是對顯示ListView做了許多優化,方面顯示而已。

下面的程序是實現一個帶有圖片的類表。

首先需要定義好一個用來顯示每一個列內容的xml

#p#

vlist.xml

view sourceprint?01

  1. <?xml version="1.0" encoding="utf-8"?>    
  2.  
  3.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  4.  
  5.     android:orientation="horizontal" android:layout_width="fill_parent"   
  6.  
  7.     android:layout_height="fill_parent">    
  8.  
  9.      
  10.  
  11.       
  12.     <ImageView android:id="@+id/img"    
  13.  
  14.        android:layout_width="wrap_content"   
  15.  
  16.          android:layout_height="wrap_content"    
  17.  
  18.          android:layout_margin="5px"/>    
  19.  
  20.       
  21.     <LinearLayout android:orientation="vertical"   
  22.          android:layout_width="wrap_content"    
  23.  
  24.          android:layout_height="wrap_content">    
  25.      
  26.         <TextView android:id="@+id/title"    
  27.            android:layout_width="wrap_content"   
  28.  
  29.             android:layout_height="wrap_content"    
  30.  
  31.              android:textColor="#FFFFFFFF"   
  32.  
  33.              android:textSize="22px" />    
  34.          <TextView android:id="@+id/info"    
  35.              android:layout_width="wrap_content"   
  36.             android:layout_height="wrap_content"    
  37.  
  38.              android:textColor="#FFFFFFFF"   
  39.  
  40.              android:textSize="13px" />       
  41.  
  42.      </LinearLayout>    
  43.  
  44.  </LinearLayout>   
  45.  
  46. 下面是實現代碼:  
  47. view sourceprint?01 /**    
  48.   * @author allin    
  49.  **/   
  50.  public class MyListView3 extends ListActivity {    
  51.     // private List<String> data = new ArrayList<String>();    
  52.     @Override   
  53.      public void onCreate(Bundle savedInstanceState) {    
  54.         super.onCreate(savedInstanceState);       
  55.          SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,    
  56.                 new String[]{"title","info","img"},    
  57.                 new int[]{R.id.title,R.id.info,R.id.img});    
  58.          setListAdapter(adapter);    
  59.     }    
  60.     private List<Map<String, Object>> getData() {    
  61.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();        
  62.          Map<String, Object> map = new HashMap<String, Object>();    
  63.         map.put("title", "G1");    
  64.         map.put("info", "google 1");    
  65.         map.put("img", R.drawable.i1);    
  66.         list.add(map);     
  67.         map = new HashMap<String, Object>();    
  68.         map.put("title", "G2");    
  69.         map.put("info", "google 2");    
  70.         map.put("img", R.drawable.i2);    
  71.         list.add(map);    
  72.         map = new HashMap<String, Object>();    
  73.         map.put("title", "G3");    
  74.         map.put("info", "google 3");    
  75.         map.put("img", R.drawable.i3);    
  76.         list.add(map);    
  77.       return list;    
  78.      }    
  79.  }  

使用simpleAdapter的數據用一般都是HashMap構成的List,list的每一節對應ListView的每一行。HashMap的每個鍵值數據映射到布局文件中對應id的組件上。因為系統沒有對應的布局文件可用,我們可以自己定義一個布局vlist.xml。下面做適配,new一個SimpleAdapter參數一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的組件id,title,info,img。布局文件的各組件分別映射到HashMap的各元素上,完成適配。

運行效果如下圖:

 

#p#

有按鈕的ListView

但是有時候,列表不光會用來做顯示用,我們同樣可以在在上面添加按鈕。添加按鈕首先要寫一個有按鈕的xml文件,然后自然會想到用上面的方法定義一個適配器,然后將數據映射到布局文件上。但是事實并非這樣,因為按鈕是無法映射的,即使你成功的用布局文件顯示出了按鈕也無法添加按鈕的響應,這時就要研究一下ListView是如何現實的了,而且必須要重寫一個類繼承BaseAdapter。下面的示例將顯示一個按鈕和一個圖片,兩行字如果單擊按鈕將刪除此按鈕的所在行。并告訴你ListView究竟是如何工作的。效果如下:

vlist2.xml

view sourceprint?01

  1. <?xml version="1.0" encoding="utf-8"?>    
  2.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android  
  3.     android:orientation="horizontal"    
  4.     android:layout_width="fill_parent"   
  5.      android:layout_height="fill_parent">     
  6.      <ImageView android:id="@+id/img"    
  7.          android:layout_width="wrap_content"   
  8.          android:layout_height="wrap_content"    
  9.          android:layout_margin="5px"/>      
  10.     <LinearLayout android:orientation="vertical"   
  11.         android:layout_width="wrap_content"    
  12.         android:layout_height="wrap_content">    
  13.          <TextView android:id="@+id/title"    
  14.            android:layout_width="wrap_content"   
  15.             android:layout_height="wrap_content"    
  16.             android:textColor="#FFFFFFFF"   
  17.              android:textSize="22px" />    
  18.         <TextView android:id="@+id/info"    
  19.              android:layout_width="wrap_content"   
  20.              android:layout_height="wrap_content"    
  21.              android:textColor="#FFFFFFFF"   
  22.             android:textSize="13px" />    
  23.      </LinearLayout>    
  24.      <Button android:id="@+id/view_btn"   
  25.        android:layout_width="wrap_content"   
  26.          android:layout_height="wrap_content"   
  27.         android:text="@string/s_view_btn"   
  28.          android:layout_gravity="bottom|right" />    
  29. </LinearLayout>   
  30. 程序代碼:  
  31. view sourceprint?001 /**    
  32.   * @author allin    
  33. **/   
  34.  public class MyListView4 extends ListActivity {    
  35.      private List<Map<String, Object>> mData;    
  36.    @Override   
  37.     public void onCreate(Bundle savedInstanceState) {    
  38.         super.onCreate(savedInstanceState);    
  39.          mData = getData();    
  40.         MyAdapter adapter = new MyAdapter(this);    
  41.          setListAdapter(adapter);    
  42.     }    
  43.      private List<Map<String, Object>> getData() {    
  44.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();        
  45.          Map<String, Object> map = new HashMap<String, Object>();    
  46.         map.put("title", "G1");    
  47.          map.put("info", "google 1");    
  48.          map.put("img", R.drawable.i1);    
  49.          list.add(map);    
  50.          map = new HashMap<String, Object>();    
  51.          map.put("title", "G2");    
  52.         map.put("info", "google 2");    
  53.          map.put("img", R.drawable.i2);    
  54.         list.add(map);    
  55.         map = new HashMap<String, Object>();    
  56.         map.put("title", "G3");    
  57.         map.put("info", "google 3");    
  58.          map.put("img", R.drawable.i3);    
  59.          list.add(map);    
  60.         return list;    
  61.      }   
  62.     // ListView 中某項被選中后的邏輯    
  63.     @Override   
  64.     protected void onListItemClick(ListView l, View v, int position, long id) {    
  65.          Log.v("MyListView4-click", (String)mData.get(position).get("title"));    
  66.     }         
  67.      /**    
  68.       * listview中點擊按鍵彈出對話框    
  69.      */   
  70.      public void showInfo(){    
  71.         new AlertDialog.Builder(this)    
  72.         .setTitle("我的listview")    
  73.         .setMessage("介紹...")    
  74.          .setPositiveButton("確定", new DialogInterface.OnClickListener() {    
  75.             @Override   
  76.            public void onClick(DialogInterface dialog, int which) {    
  77.            }    
  78.        })    
  79.         .show();    
  80.      }    
  81.      public final class ViewHolder{    
  82.        public ImageView img;    
  83.          public TextView title;    
  84.          public TextView info;    
  85.         public Button viewBtn;    
  86.     }    
  87.    public class MyAdapter extends BaseAdapter{    
  88.        private LayoutInflater mInflater;    
  89.          public MyAdapter(Context context){    
  90.              this.mInflater = LayoutInflater.from(context);    
  91.        }           
  92.         @Override   
  93.          public int getCount() {    
  94.              // TODO Auto-generated method stub    
  95.              return mData.size();    
  96.          }      
  97.          @Override   
  98.          public Object getItem(int arg0) {    
  99.              // TODO Auto-generated method stub    
  100.              return null;    
  101.          }    
  102.          @Override   
  103.         public long getItemId(int arg0) {    
  104.              // TODO Auto-generated method stub    
  105.             return 0;    
  106.          }    
  107.          @Override   
  108.          public View getView(int position, View convertView, ViewGroup parent) {                    
  109.              ViewHolder holder = null;    
  110.              if (convertView == null) {    
  111.                 holder=new ViewHolder();      
  112.                  convertView = mInflater.inflate(R.layout.vlist2, null);    
  113.                  holder.img = (ImageView)convertView.findViewById(R.id.img);    
  114.                  holder.title = (TextView)convertView.findViewById(R.id.title);    
  115.                 holder.info = (TextView)convertView.findViewById(R.id.info);    
  116.                  holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);    
  117.                  convertView.setTag(holder);     
  118.             }else {    
  119.              holder = (ViewHolder)convertView.getTag();    
  120.                   }     
  121.              holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));    
  122.              holder.title.setText((String)mData.get(position).get("title"));    
  123.              holder.info.setText((String)mData.get(position).get("info"));       
  124.             holder.viewBtn.setOnClickListener(new View.OnClickListener() {                        
  125.                  @Override   
  126.                  public void onClick(View v) {    
  127.                  showInfo();                     
  128.                  }    
  129.             });    
  130.              return convertView;    
  131.         }    
  132.     }    
  133.  }  

  下面將對上述代碼,做詳細的解釋,listView在開始繪制的時候,系統首先調用getCount()函數,根據他的返回值得到listView的長度(這也是為什么在開始的***張圖特別的標出列表長度),然后根據這個長度,調用getView()逐一繪制每一行。如果你的getCount()返回值是0的話,列表將不顯示同樣return 1,就只顯示一行。

  系統顯示列表時,首先實例化一個適配器(這里將實例化自定義的適配器)。當手動完成適配時,必須手動映射數據,這需要重寫getView()方法。系統在繪制列表的每一行的時候將調用此方法。getView()有三個參數,position表示將顯示的是第幾行,covertView是從布局文件中inflate來的布局。我們用LayoutInflater的方法將定義好的vlist2.xml文件提取成View實例用來顯示。然后將xml文件中的各個組件實例化(簡單的findViewById()方法)。這樣便可以將數據對應到各個組件上了。但是按鈕為了響應點擊事件,需要為它添加點擊監聽器,這樣就能捕獲點擊事件。至此一個自定義的listView就完成了,現在讓我們回過頭從新審視這個過程。系統要繪制ListView了,他首先獲得要繪制的這個列表的長度,然后開始繪制***行,怎么繪制呢?調用getView()函數。在這個函數里面首先獲得一個View(實際上是一個ViewGroup),然后再實例并設置各個組件,顯示之。好了,繪制完這一行了。那 再繪制下一行,直到繪完為止。在實際的運行過程中會發現listView的每一行沒有焦點了,這是因為Button搶奪了listView的焦點,只要布局文件中將Button設置為沒有焦點就OK了。

運行效果如下圖:

【編輯推薦】

深入理解Android消息處理系統原理

開發者對Android Market改進的三大建議

Android開發:自定義GridView/ListView數據源

責任編輯:zhaolei 來源: 博客園
相關推薦

2013-03-27 09:17:17

Android開發AndroidList

2011-06-03 10:48:23

Android ListView

2014-12-17 09:46:30

AndroidListView最佳實踐

2013-07-10 10:21:22

Android Lis

2017-11-08 14:34:20

圖片fresco程序員

2011-10-19 10:08:01

AndroidListView

2015-10-22 10:59:13

ListViewItem刷新

2010-01-25 17:53:35

Android Lis

2011-04-11 13:43:35

popupwindowlistviewAndroid

2014-09-17 11:20:38

AndroidListView技巧

2010-09-10 10:09:26

Android

2013-08-07 10:47:58

Android特效ListView

2013-08-07 10:35:02

AndroidListView拖拽

2011-04-11 14:14:29

checkboxlistviewAndroid

2013-09-17 14:00:19

AndroidListView原理

2017-01-11 19:05:45

AndroidAndroid Loa詳解

2014-07-24 09:11:34

2013-11-14 16:50:08

2013-11-14 10:42:48

MTPAndroid

2014-07-28 10:09:30

Android
點贊
收藏

51CTO技術棧公眾號

精品国产老师黑色丝袜高跟鞋| 婷婷亚洲综合| 免费av播放| 99久久99久久| 亚洲视频在线观看视频| 亚洲永久免费av| 精品影视av免费| 亚洲香蕉视频| 波多野结依一区| 伊人资源视频在线| 大片在线观看网站免费收看| 国产一区红桃视频| 中文字幕成人精品久久不卡| 日韩欧美中文第一页| 国产成人免费在线观看| 色综合蜜月久久综合网| 成人黄色免费网站| 搞黄视频免费在线观看| 密臀av一区二区三区| 欧美精品v日韩精品v国产精品| 欧美黄色免费网站| 精品国产免费一区二区三区四区| 亚洲伦理在线精品| 国产成人免费xxxxxxxx| 欧美日韩午夜| 日韩精品免费一区二区夜夜嗨| 色戒汤唯在线观看| 男人天堂网在线| 播九公社成人综合网站| 青青草影院在线观看| 51成人做爰www免费看网站| 欧美多人爱爱视频网站| 亚洲高清不卡av| 色综合色综合色综合| 国产精品久久久久久亚洲毛片| 精品在线亚洲视频| 99xxxx成人网| 水蜜桃久久夜色精品一区| 中文字幕中文字幕在线十八区| 久草网在线视频| 亚洲精品中字| 在线国产91| 狠狠操一区二区三区| 色狠狠一区二区三区| 激情aⅴ欧美一区二区欲海潮| 极品视频在线| 欧美艳星kaydenkross| 四虎成人在线| 欧美另类99xxxxx| 欧美tickling网站挠脚心| 亚洲va国产va欧美va观看| 久久无码av三级| 久久国产综合精品| 亚洲视频播放| 亚洲第一天堂| 日韩激情毛片| 北条麻妃在线一区二区免费播放 | 久久久精品国产一区二区三区| 全亚洲最色的网站在线观看| 久久精品视频99| 亚洲久久久久久久久久| 欧美午夜视频网站| 欧美日韩国产一区二区| 一区二区三区四区激情| 亚洲国产精品精华液2区45| 99国产精品99久久久久久| 精品一区二区三区免费| 久久久久久久欧美精品| 国产精品五区| 在线免费观看欧美| 国产精品99一区二区| 日韩在线观看电影完整版高清免费悬疑悬疑 | 久久久久久夜| 影音先锋久久| 午夜精品久久| 午夜精品国产| 久久精品国内一区二区三区水蜜桃| 日本午夜精品久久久| 1204国产成人精品视频| 在线高清欧美| 激情视频亚洲| 亚洲视频资源| 91成人短视频在线观看| 深夜日韩欧美| 色999久久久精品人人澡69| 国产韩日精品| 成人免费在线观看视频| 欧美日韩精品一区二区三区视频| xxxxx性欧美特大| 久久久成人av毛片免费观看| 久久国内精品| 日本精品在线播放 | 一级在线视频| 免费三级欧美电影| 欧美视频网址| 一区二区免费视频| 国产91在线播放| 一区二区三区区四区播放视频在线观看| 伊人春色之综合网| 欧美日韩一区二区免费在线观看| 91久久精品在线| 日本视频在线播放| 99久久精品国产导航| 欧美一级黄色网| 成人av电影观看| 日韩av一区二区三区四区| 久久人人爽人人爽人人片亚洲| 欧美日韩一区二区三| 高清在线观看av| 成人国产精品免费观看视频| 91九色国产社区在线观看| 久久久久97| 亚洲熟妇av一区二区三区| 黄色一级免费大片| 在线影院自拍| av女优在线| 成人欧美大片| 国产精品欧美大片| 欧美一区亚洲| 蜜芽一区二区三区| 久久日韩粉嫩一区二区三区| 亚洲午夜精品网| 欧美挠脚心视频网站| 亚洲欧洲美洲在线综合| 欧美另类在线播放| 国产主播欧美精品| 日韩欧美亚洲区| 极品美女扒开粉嫩小泬| 国产91久久久久蜜臀青青天草二| 国产欧美一区二区三区在线看蜜臀| 91视频-88av| 精品亚洲二区| 日韩精品视频免费| 污黄网站在线观看| 亚洲欧洲日韩av| 少妇久久久久久被弄到高潮| 欧美激情四色| 午夜免费日韩视频| 精精国产xxx在线视频app | 欧美日韩另类在线| 激情五月六月婷婷| 性久久久久久| 欧美中文字幕在线观看| av中文资源在线| 国产福利一区二区三区| 欧美最猛性xxxxx(亚洲精品)| 精品久久亚洲| 亚洲精品久久久久久国产精华液| 国产欧美在线一区二区| 美女精品久久| 91精品久久久久久久99蜜桃| 亚洲视频在线二区| 九九热爱视频精品视频| 欧美妇女性影城| 亚洲一区在线直播| 久久久久久美女精品| 欧美丰满少妇xxxxx高潮对白 | 国产毛片精品| 日韩欧美一二区| 蝌蚪视频在线播放| 色哟哟国产精品| 在线看片你懂得| 亚洲高清视频中文字幕| 在线免费观看污| 国产精品亚洲成在人线| 91久久国产| 91免费版在线| 欧美精三区欧美精三区| 午夜免费久久久久| 秋霞久久久久久一区二区| 成年美女网站| 最近在线中文字幕| 中出一区二区| 国产午夜三级一区二区三| 日韩一区二区三区免费看| 日本一区二区在线播放| 黄色污污在线观看| 国产区在线视频| 成人影院中文字幕| 国内久久精品视频| 香蕉成人伊视频在线观看| 日韩网站免费观看高清| 久久精品magnetxturnbtih| 啊啊啊啊啊好爽| 桃花岛成人影院| 国产视频一区在线观看一区免费| 亚洲视频小说图片| 社区色欧美激情 | 欧美日韩一区二区三区在线观看免| 少妇激情av一区二区三区| 亚洲午夜国产成人| 卡一卡二国产精品| 欧美在线观看视频一区二区| 全球成人中文在线| 97国产在线播放| 青春草视频在线| 欧美婷婷在线| 亚洲第一在线综合网站| 69精品小视频| 日韩中文字幕三区|