天天看點

Android中的ListView使用案例(SimpleAdapter實作)

ListView是可以垂直的滾動的顯示一組清單的内容,其中的每一個條目可以是一個單獨的元件,也可以是由多個元件組成的組合控件。

實作一個ListView控件的步奏:

1、準備ListView所要顯示的資料,一般為一維或二維動态數組。

2、建構擴充卡,由于ListView中的每一個條目可以很簡單,也可以很複雜,根據需要可以選擇ArrayAdapter、SimpleAdapter、或者BaseAdapter。

3、使用setAdapter為一個ListView控件設定擴充卡。

4、為ListView添加監聽器。

下面看具體的案例:

建立主界面,添加ListView控件

檔案名稱為:activity_main.xml

需要說明的是:該ListView的id為@android:id/list,否則NullPointException

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <ListView 
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        ></ListView>

</LinearLayout>
           

建立條目界面

檔案名稱為:item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="horizontal"
    >
    <ImageView
        android:contentDescription="@null"
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <TextView 
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#CCCC99"/>
        <TextView 
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#CCCC99"
            />
    </LinearLayout>

</LinearLayout>
           

具體邏輯代碼

package com.yangzi.listview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends ListActivity{
    private ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到ListView控件
        list = (ListView)findViewById(android.R.id.list);
        //生成擴充卡的item和動态數組對應元素
        構造函數原型:public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
        參數說明:
        context(this) 目前Activity對象
        data(getData() ) 要顯示的資料,List集合類型
        resource(R.layout.item) 條目的布局檔案
        from(建立的數組) data參數中Map的鍵名,要和生成資料中Map的鍵名一緻
        to (建立的數組) 條目布局檔案中用于顯示的控件
        */
        SimpleAdapter adapter = new SimpleAdapter(
                this, 
                getData(), 
                R.layout.item, 
                new String[]{"img","title","info"}, 
                new int[]{R.id.img,R.id.title,R.id.info});
        //設定擴充卡
        list.setAdapter(adapter);
        //設定監聽事件
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                Map<String,Object> clkmap = (Map<String,Object>)arg0.getItemAtPosition(arg2);
                setTitle(clkmap.get("title").toString()+"的網址是:"+clkmap.get("info").toString());
            }
        });
    }
    private List<Map<String,Object>> getData(){
        //這裡可以看做對應ListView控件中的每一條Item
        ArrayList<Map<String,Object>> listitem = new ArrayList<Map<String,Object>>();
        //這裡可以看做ListView控件中的每一條Item中的具體資料
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("img", R.drawable.xx);//放置img
        map.put("title", "百度");//放置title
        map.put("info", "http://www.baidu.com");//放置info
        listitem.add(map);//一條記錄設定好了,就添加進去

        map = new HashMap<String, Object>();
        map.put("img", R.drawable.xx);
        map.put("title", "新浪");
        map.put("info", "http://www.sina.com.cn");
        listitem.add(map);

        //下面為了更明顯的看到ListView控件的效果,使用循環添加多個記錄
        for (int i = ; i < ; i++) {
            map = new HashMap<String, Object>();
            map.put("img", R.drawable.xx);
            map.put("title", "我的網站"+i);
            map.put("info", "http://www.sina.com.cn@"+i);
            listitem.add(map);
        }

        return listitem;
    }
}