ListView 絕對能夠稱得上是 Android 中最經常使用的控件之一, 當咱們的程 序中有大量的數據須要展現的時候,就能夠藉助 ListView 來實現。ListView 容許用戶經過手 指上下滑動的方式將屏幕外的數據滾動到屏幕內,同時屏幕上原有的數據則會滾動出屏幕。 android
1.數據庫
public class MainActivity extends Activity { private String[] data={"hao","hasds","adss","asasd","asddsa", "sadsda","sfd","sdfsdf","dsf","asdfdsa", "udfsiu","dsfu","fasdsf","jfsdyg","udhsf"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter=new ArrayAdapter<String> (MainActivity.this,android.R.layout.simple_list_item_1 ,data); ListView listView=(ListView) findViewById(R.id.list_view); listView.setAdapter(adapter); } }
即然 ListView 是用於展現大量數據的,那咱們就應該先將數據 供好。這些數據能夠是 從網上下載的,也能夠是從數據庫中讀取的,應該視具體的應用程序場景來決定。不過,數組中的數據是沒法直接傳遞給 ListView 的,咱們還須要藉助適配器來完成。 Android 中 供了不少適配器的實現類,其中我認爲最好用的就是 ArrayAdapter。它能夠通 過泛型來指定要適配的數據類型,而後在構造函數中把要適配的數據傳入便可。ArrayAdapter 有多個構造函數的重載,你應該根據實際狀況選擇最合適的一種。這裏因爲咱們 供的數據 都是字符串,所以將 ArrayAdapter 的泛型指定爲 String,而後在 ArrayAdapter 的構造函數中 依次傳入當前上下文、ListView 子項佈局的 id,以及要適配的數據。注意咱們使用了 android.R.layout.simple_list_item_1 做爲 ListView 子項佈局的 id,這是一個 Android 內置的布 局文件,裏面只有一個 TextView,可用於簡單地顯示一段文本。最後,還須要調用 ListView 的 setAdapter()方法,將構建好的適配器對象傳遞進去,這 樣 ListView 和數據之間的關聯就創建完成了。 數組
2.定製ListView頁面,咱們先定義一個實體類做爲ListView的適配類型,而後咱們還須要爲咱們的ListView的子項指定自定義的佈局,即爲咱們的實體類的屬性再定義一個佈局,咱們好須要在建立一個自定義的適配器,這個適配器繼承自ArrayAdapter,重寫了父類的一組構造函數,用於將上下文、ListView 子項佈局的 id 和數 據都傳遞進來。另外又重寫了 getView()方法,這個方法在每一個子項被滾動到屏幕內的時候 會被調用。在 getView 方法中,首先經過 getItem()方法獲得當前項的 Fruit 實例,而後使用 LayoutInflater 來爲這個子項加載咱們傳入的佈局,接着調用 View 的 findViewById()方法分別 獲取到 ImageView 和 TextView 的實例,並分別調用它們的 setImageResource()和 setText()方 法來設置顯示的圖片和文字,最後將佈局返回,這樣咱們自定義的適配器就完成了。而後咱們就向ArrayList中初始化數據,而後初始化自定義的適配器,拿到ListView的id,爲它添加適配器。緩存
3.ListView的優化,咱們自定義Adapter時候的getView()方法每次都將佈局從新加一遍,當ListView快速滾動時候這就成爲了瓶頸了,咱們能夠經過getView()方法的convertView參數進行緩存,在 getView()方法中進行了判斷,若是 convertView 爲空,則使用 LayoutInflater 去加載佈局,若是不爲空則直接對 convertView 進行重用。這樣就大大 高了 ListView 的運行效率,在快速滾動的時候也能夠表現出更好的性能。可是每次在 getView()方法中仍是會調用 View 的 findViewById()方法來獲取一次控件的實例,咱們經過內部類的中定義控件Id屬性來幫助咱們解決重複加載。
4.ListView的點擊事件,ide
listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { }});
而後在經過ArrayList中的get (position) 獲取到當前的點擊事件。函數