編輯:Android開發實例
前言
今天講解一下Android平台下ListView控件的開發,在本文中,將介紹ListView的一些常用屬性、方法及事件,還會講解ListView在開發中常用的幾種方式,以及使用不通用的適配器Adapter定制個性的View視圖用於ListView的展示。
ListView
ListView,列表視圖,直接繼承了AbsListView,是一個以垂直方式在項目中顯示View視圖的列表。ListView的數據項,來自一個繼承了ListAdapter接口的適配器。
ListView的常用屬性一般就是用來設置列表的間隔、分割線、表頭、表尾等屬性的,常用屬性有以下幾個,並且Android也為其提供了對應的setter/getter方法:
ListView提供了一些方法,用於操作ListView。這裡介紹一些常用的方法,更多的請參見API文檔:
作為一個列表選擇控件,ListView具有一些選中選項可以觸發的事件,但它本身沒有定義這些事件,均繼承自間接父類AdapterView。ListView支持的幾個常用事件有以下幾個:
在Android項目中使用ListView,有兩種方式,一種是通過一個繼承了ListActivity的Activity,在其中設定ListAdapter,對於這種方式,比較適用於整個頁面就是一個ListView;第二種方式就是直接使用ListView控件,這種方式也是項目中比較常用的方式。
ListActivity
ListActivity繼承了Activity,並通過綁定一個ListAdapter來顯示一個數據列表。需要注意的是,如果對列表項的數據格式沒有特殊要求,它完全可以不使用布局文件即可創建一個ListView,因為ListActivity類本身已經包含了一個ListView。因此在onCreate()方法中,不需要調用setContentView()方法來從一個布局文件加載用戶界面。
在ListActivity的onCreate()方法中,可以直接使用this.setListAdapter()方法為這個ListView設定ListAdapter。如果想獲得並操作這個ListActivity自帶的ListView,可以使用this.getListView()方法獲取。
下面通過一個Demo講解一下使用繼承ListActivity的方式來實現ListView,因為這裡只是使用一個ArrayAdapter填充數據,無需指定布局文件,這裡只提供實現代碼:
- package com.bgxt.datatimepickerdemo;
- import android.app.ListActivity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class ListActivityDemo extends ListActivity {
- private String[] presidents={"北京","深圳","濟南","廣州","海南","香港","澳門"};
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- ListView listview=getListView();
- //添加一個TextView作為表頭
- TextView tvHeader=new TextView(ListActivityDemo.this);
- tvHeader.setText("城市列表頭");
- listview.addHeaderView(tvHeader);
- //添加一個TextView作為表尾
- TextView tvFooter=new TextView(ListActivityDemo.this);
- tvFooter.setText("城市列表尾");
- listview.addFooterView(tvFooter);
- listview.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,presidents));
- }
- @Override
- protected void onListItemClick(ListView parent, View view, int position, long id) {
- Toast.makeText(this, "You have selected "+presidents[position], Toast.LENGTH_SHORT).show();
- }
- }
效果展示:
使用ListView控件構建
上面介紹的這種方式會將整個Activity都作為一個ListView,但是在實際項目中,一般還是把ListView作為一個數據顯示控件,填充在布局中。現在通過一個簡單的Demo,講解使用ListView控件展示一個ArrayAdapter填充的數據列表。
布局代碼:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <!-- 設定列表項的分割線為藍色,並且數據項之間分割10個dp -->
- <ListView
- android:id="@+id/listviewsimple"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:divider="#00F"
- android:dividerHeight="10dp"/>
- </LinearLayout>
實現代碼:
- package com.bgxt.datatimepickerdemo;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class ListViewSimpleActivity extends Activity {
- private ListView listview;
- private ArrayAdapter<String> adapter;
- private List<String> data;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_listviewsimple);
- getData();//填充數據
- listview=(ListView)findViewById(R.id.listviewsimple);
- //設定列表項的選擇模式為單選
- adapter=new ArrayAdapter<String>(ListViewSimpleActivity.this, android.R.layout.simple_list_item_single_choice, data);
- listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- listview.setAdapter(adapter);
- }
- private void getData(){
- data=new ArrayList<String>();
- data.add("北京");
- data.add("上海");
- data.add("深圳");
- data.add("武漢");
- data.add("宜昌");
- data.add("成都");
- data.add("貴陽");
- data.add("杭州");
- data.add("濟南");
- data.add("天津");
- }
- }
效果展示:
使用SimpleAdapter填充數據
ListView的使用范圍很廣,一般也不僅僅用來展示簡單的數據,對於一些復雜樣式的數據而言,可以使用SimpleAdapter這個適配器。對於SimpleAdapter適配器的用法,可以參見我的另外一篇:http://www.fengfly.com/plus/view-213501-1.html,這裡就不再累述了。
下面直接通過一個Demo講解,在這個Demo中,對於SimpleAdapter填充樣式而言,不再單獨給定模板,直接使用布局的模板。
布局代碼:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal" >
- <!-- LinnerLayout定義的三個控件,將成為ListView控件的模板 -->
- <ImageView
- android:id="@+id/ivIcon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="3dp"
- android:maxHeight="5dp"
- android:maxWidth="5dp"
- android:src="@drawable/ic_launcher" />
- <TextView
- android:id="@+id/tvName"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
- android:layout_weight="1"
- android:text="好友名稱" />
- <TextView
- android:id="@+id/tvSS"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="10dp"
- android:layout_weight="4"
- android:text="簽名" />
- </LinearLayout>
- <ListView
- android:id="@+id/lvArray"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
實現代碼:
- package com.bgxt.datatimepickerdemo;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- public class SimpleAdapterActivity extends Activity {
- private ListView listview;
- private SimpleAdapter simpleAdapter;
- private List<Map<String, Object>> data;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_listviewarrayadapter);
- listview = (ListView) findViewById(R.id.lvArray);
- //填充數據
- putData();
- //這裡使用當前的布局資源作為ListView的模板。
- //使用這種方式,SimpleAdapter會忽略ListView控件,僅以ListView之外的控件作為模板。
- simpleAdapter = new SimpleAdapter(SimpleAdapterActivity.this, data,
- R.layout.activity_listviewarrayadapter, new String[] { "icon",
- "name", "ss" }, new int[] { R.id.ivIcon, R.id.tvName,
- R.id.tvSS });
- listview.setAdapter(simpleAdapter);
- }
- private void putData()
- {
- data=new ArrayList<Map<String,Object>>();
- Map<String, Object> map1=new HashMap<String, Object>();
- map1.put("icon", R.drawable.item1);
- map1.put("name", "簡愛");
- map1.put("ss", "風將綠了夜的途");
- Map<String, Object> map2=new HashMap<String, Object>();
- map2.put("icon", R.drawable.item2);
- map2.put("name", " 陌 陌");
- map2.put("ss", "尋找你,你在我心中__。");
- Map<String, Object> map3=new HashMap<String, Object>();
- map3.put("icon", R.drawable.item3);
- map3.put("name", "汐顏");
- map3.put("ss", "最新分享:中國合伙人正能量22句話...");
- Map<String, Object> map4=new HashMap<String, Object>();
- map4.put("icon", R.drawable.item4);
- map4.put("name", "花仙子");
- map4.put("ss", " ");
- data.add(map1);
- data.add(map2);
- data.add(map3);
- data.add(map4);
- }
- }
效果展示:
源碼下載
本人小菜一個。目前只見過兩種彈出框的實現方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過。感覺很霸氣哦。沒想到,a
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我