本文以一個小例子,簡述Android開發中ListView的相關應用,僅供學習分享使用。 ...
本文以一個小例子,簡述Android開發中ListView的相關應用,僅供學習分享使用。
概述
ListView是一個顯示可滾動項目列表的視圖組(view group),列表項通過適配器(Adapter)將數組或者資料庫查詢等數據源中的數據插入到列表中,並將每一個項的內容轉換到視圖中顯示出來。
數據填充步驟
- 構建數據源,如數組,列表等。
- 將數據源填充到適配器中。
- 將適配器綁定到列表中。
涉及知識點
- android:dividerHeight 設置列表項分割線的高度。
- android:divider 設置分割線的顏色。
- android:listSelector 設置選中項的背景色。
- android:choiceMode 設置選擇模式,如單選,多選等。
- ArrayAdapter 數據適配器,用於將數組類型的數據源填充到適配器。
- addHeaderView 增加Header視圖,必須在setAdapter之前調用。
- addFooterView 增加尾部視圖。
- setOnItemClickListener 設置列表項點擊監聽事件。
- setOnItemLongClickListener 設置列表項長按監聽事件。事件有個返回值,如果返回true 表示被處理,只響應長按事件,如果返回false,表示還會響應單擊事件。
UI結構
關於View和ViewGroup之間的關係,如下圖所示:
示例截圖
ListView效果圖如下所示:
示例源碼
xml佈局源碼如下:
1 <ListView 2 android:id="@+id/lv_info" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:dividerHeight="2dp" 6 android:divider="@color/colorDivider" 7 android:choiceMode="singleChoice" 8 android:listSelector="@color/colorSelected" 9 />
綁定數據源代碼如下(包括增加header和footer):
1 mListView= (ListView) this.findViewById(R.id.lv_info); 2 //1.初始化數據源 3 lstInfo=new ArrayList<>(); 4 for(int i=0;i<20;i++){ 5 lstInfo.add("Item=>"+i); 6 } 7 //2.構造適配器 8 adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,lstInfo); 9 //3.給ListView賦值 10 //addHeaderView必須在setAdapter之前設置,否則不起作用 11 TextView textView=new TextView(MainActivity.this); 12 textView.setText("ListView的小例子"); 13 textView.setTextSize(20); 14 textView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 15 mListView.addHeaderView(textView); 16 mListView.setAdapter(adapter); 17 Button btnMore=new Button(MainActivity.this); 18 btnMore.setText("載入更多..."); 19 textView.setTextSize(20); 20 btnMore.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 21 btnMore.setOnClickListener(new View.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 int index=lstInfo.size(); 25 for(int i=index;i<index+20;i++){ 26 lstInfo.add("Item=>"+(i)); 27 } 28 adapter.notifyDataSetChanged(); 29 } 30 }); 31 mListView.addFooterView(btnMore);
事件監聽代碼如下:
1 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 2 3 /** 4 * 5 * @param parent 表示控制項的主體,此處表示ListView 6 * @param view 表示當前被點擊的項對應的控制項 7 * @param position 表示當前點擊項的索引位置 8 * @param id 被點擊的行的id 9 */ 10 @Override 11 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 12 String s1 = parent.getItemAtPosition(position).toString(); 13 Toast.makeText(MainActivity.this, "當前點擊的是=>" + s1, Toast.LENGTH_SHORT).show(); 14 } 15 }); 16 mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 17 18 /** 19 * @param parent 表示控制項的主體,此處表示ListView 20 * @param view 表示當前被點擊的項對應的控制項 21 * @param position 表示當前點擊項的索引位置 22 * @param id 被點擊的行的id 23 * @return 如果返回true 表示被處理,只響應長按事件,如果返回false,表示還會響應單擊事件 24 */ 25 @Override 26 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 27 String s1=parent.getItemAtPosition(position).toString(); 28 Toast.makeText(MainActivity.this,"當前長按的是=>"+s1,Toast.LENGTH_SHORT).show(); 29 return true; 30 } 31 });
複雜列表
當LisvView中的列表項有多個內容時,可以使用SimpleAdapter來實現多列顯示。
示例效果圖如下:
步驟如下:
1. 定義一個listview_item.xml的列表項佈局文件。
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 <TextView 6 android:id="@+id/tv_name" 7 android:layout_width="wrap_content" 8 android:layout_weight="1" 9 android:layout_height="wrap_content"/> 10 <TextView 11 android:id="@+id/tv_age" 12 android:layout_weight="1" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content"/> 15 <TextView 16 android:id="@+id/tv_love" 17 android:layout_weight="1" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content"/> 20 </LinearLayout>
2. 代碼中將適配器的和佈局文件關聯起來(採用List<Map<String ,Object>>作為數據源)
1 mListView2= (ListView) this.findViewById(R.id.lv_info2); 2 //1. 構造數據源 3 List<Map<String ,Object>> lst=new ArrayList<Map<String ,Object>>(); 4 for(int i=0;i<20;i++){ 5 Map<String ,Object> map=new HashMap<String,Object>(); 6 map.put("colName","張三"+i); 7 map.put("colAge",18+i); 8 map.put("colLove","籃球"+i); 9 lst.add(map); 10 } 11 //2. 構造適配器填充 12 SimpleAdapter adapter=new SimpleAdapter(Main2Activity.this,lst, 13 R.layout.listview_item, 14 new String[]{"colName","colAge","colLove"}, 15 new int[]{ R.id.tv_name,R.id.tv_age,R.id.tv_love}); 16 //3. 綁定適配器 17 mListView2.setAdapter(adapter);
3. 點擊事件,獲取內容
1 mListView2.setOnItemClickListener(new AdapterView.OnItemClickListener() { 2 @Override 3 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 4 String s1 = parent.getItemAtPosition(position).toString();//此處返回的是鍵值對轉換後的字元串 5 TextView tvName= (TextView) view.findViewById(R.id.tv_name); 6 TextView tvAge= (TextView) view.findViewById(R.id.tv_age); 7 TextView tvLove= (TextView) view.findViewById(R.id.tv_love); 8 String s2="Name=>"+tvName.getText()+"Age=>"+tvAge.getText()+"Love=>"+tvLove.getText(); 9 Toast.makeText(Main2Activity.this, "當前點擊的是s1=>" + s1+"S2=>"+s2, Toast.LENGTH_SHORT).show(); 10 } 11 });
備註
本文為入門級學習知識總結,如有不足之處,還請指正,謝謝。