Android之UI學習篇:ListView控件學習(一)

ListView這個控件使用的非常普遍,關於它的基本介紹,我們來看一下API中的介紹:

Class Overview

A view that shows items in a vertically scrolling list. The items come from the ListAdapter associated with this view.

 

我們的LIstView中顯示的數據都是通過ListAdapter這個接口來配置的,通常是用它的某一個子類來配置數據,下面來介紹一下各種適配器以及他們的關系:

ListAdapter

implements Adapter

android.widget.ListAdapter

Known Indirect Subclasses

ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, WrapperListAdapter

Class Overview

Extended Adapter that is the bridge between a ListView and the data that backs the list. Frequently that data comes from a Cursor, but that is not required. The ListView can display any data provided that it is wrapped in a ListAdapter.

 

在ListAdapter的眾多子類當中,用的最多的就是ArrayAdapter(存儲數組)、SimpleAdapter(字符串)、CursorAdapter(數據庫中的數據)。

在使用LIstView控件來顯示數據時,有兩種實現方式:

第一種實現方式: 在xml中定義<LIstView>佈局對象,設置它的相關屬性,然後在Activity中對它進行配置和事件監聽;

第二種實現方式: 讓你的 Activity 類繼承 ListActivity,可以通過getListView()來獲取,可以不寫ListView的xml文件。

本篇文章將以第二種方式為例來做一個簡單的實例。

首先來認識一下ListActivity這個類:

java.lang.Object

↳ android.content.Context

  ↳ android.content.ContextWrapper

  ↳ android.view.ContextThemeWrapper

  ↳ android.app.Activity

  ↳ android.app.ListActivity

正如名字含義,它是Activity的一個子類。

Class Overview

An activity that displays a list of items by binding to a data source such as an array or Cursor, and exposes event handlers when the user selects an item.

ListActivity hosts a ListView object that can be bound to different data sources, typically either an array or a Cursor holding query results. Binding, screen layout, and row layout are discussed in the following sections.

ListActivity has a default layout that consists of a single, full-screen list in the center of the screen

我可以直接使用內置的默認, full-screen list,當然很多時候要做一些擴充,我們可以自定義screen layout,使用setContentView() in onCreate()來顯示定義的ListView, 不過這裡有一要求,To do this, your own view MUST contain a ListView object with the id "@android:id/list" (or list if it's in code)

這樣的原因是什麼呢?

原因是我們繼承ListActivity這個類,使用getListView()來取得它,系統在執行該方法的時候是按照 id= list 去查找,所以我們必須定義Id為" @android:id/list"。知道瞭吧!

 

我們通過一個在String.xml文件裡面配置多個國傢的名稱,然後通過適配器ArrayAdapter來顯示這些數據到我們的LIstView控件中,並且提供根據用戶輸入的匹配符,篩選出匹配的國傢名稱。

運行結果:

大傢可以看到國傢的名稱已經顯示在LIstView控件當中瞭,當我們輸入"be"是自動匹配的結果截圖:

其實這個自動匹配功能很簡單,隻要在代碼中調用這句代碼:listView.setTextFilterEnabled(true);

 

工程目錄結構:

 

以下是源代碼:

MainActivity.java:

[html] 

package com.listview.activity;  

  

import android.app.ListActivity;  

import android.os.Bundle;  

import android.view.View;  

import android.widget.AdapterView;  

import android.widget.AdapterView.OnItemClickListener;  

import android.widget.ArrayAdapter;  

import android.widget.ListView;  

import android.widget.TextView;  

import android.widget.Toast;  

  

public class MainActivity extends ListActivity implements OnItemClickListener {  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        String[] countries = getResources().getStringArray(R.array.countries_array);  

        // 為ListView設置適配器  

        setListAdapter(new ArrayAdapter<String>(MainActivity.this, R.layout.list_item, countries));  

        ListView listView = getListView();  

        //設置Item的選中事件監聽器  

        listView.setOnItemClickListener(this);  

        //這個屬性為true表示listview獲得當前焦點的時候,相應用戶輸入的匹配符,篩選出匹配的listview Items  

        listView.setTextFilterEnabled(true);  

    }  

  

    @Override  

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  

        Toast.makeText(MainActivity.this, ((TextView)view).getText(), 1).show();  

    }  

}  

 

main.xml在這裡沒起作用,這裡就不給出代碼瞭。

list_item.xml:

[html]  

<?xml version="1.0" encoding="utf-8"?>  

<TextView xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    android:padding="10dp"  

    android:textSize="16sp" >  

</TextView>  

 

strings.xml:

[html]  

<?xml version="1.0" encoding="utf-8"?>  

<resources>  

  

    <string name="hello">Hello World, MainActivity!</string>  

    <string name="app_name">HelloListView</string>  

  

    <string-array name="countries_array">  

        <item>Bahrain</item>  

        <item>Bangladesh</item>  

        <item>Barbados</item>  

        <item>Belarus</item>  

        <item>Belgium</item>  

        <item>Belize</item>  

        <item>Benin</item>  

        <item>Bermuda</item>  

        <item>Bhutan</item>  

        <item>Bolivia</item>  

        <item>Bosnia and Herzegovina</item>  

        <item>Botswana</item>  

        <item>"Bouvet Island</item>  

        <item>Brazil</item>  

    </string-array>  

  

</resources>  

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *