AdapterView及其子类之四:基于ListView及SimpleAdapter实现列表

代码请见SimpleAdapterDemo.zip。

步骤如下:

1、创建主布局文件

<RelativeLayout 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="@+id/listview"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:divider="#00ff00"
        android:dividerHeight="2dp"
        android:headerDividersEnabled="false"
         />

</RelativeLayout>
2、创建每个列表选项的视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_listview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <ImageView 
        android:id="@+id/iv_header"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight="1"
        android:contentDescription="@string/header"/>

    <LinearLayout
        android:id="@+id/ll_title_content"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:orientation="vertical" 
        android:layout_weight="4">

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:background="#000000" />

        <TextView
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:background="#00ff00" />
    </LinearLayout>

</LinearLayout>

3、创建主类

package com.ljh.listviewdemo;

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

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;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// (1)创建要显示的文本内容
		String[] arr = { "header", "title", "content" };
		// (2)与使用ListActivity的最大区别:使用findViewById得到一个ListView
		ListView lv = (ListView) findViewById(R.id.listview);

		// (3)创建ArrayAdapter,其中第二个参数resource:The resource ID for a layout file
		// containing a TextView to use when instantiating views.是要以一个layout作为
		// 参数,且此layout需要包含textview。
		/*
		 * ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
		 * R.layout.list, arr);
		 */

		String[] titles = { "title1", "title2", "title3", "title4" };
		String[] contents = { "content1", "content2", "content3", "content4" };
		int[] headers = { R.drawable.p1, R.drawable.p2, R.drawable.p3,
				R.drawable.p4 };
		List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();

		/*
		 * Parameters: 
		 * context The context where the View associated with this
		 * SimpleAdapter is running data A List of Maps. Each entry in the List
		 * corresponds to one row in the list. The Maps contain the data for
		 * each row, and should include all the entries specified in "from"
		 * resource Resource identifier of a view layout that defines the views
		 * for this list item. The layout file should include at least those
		 * named views defined in "to" from A list of column names that will be
		 * added to the Map associated with each item. to The views that should
		 * display column in the "from" parameter. These should all be
		 * TextViews. The first N views in this list are given the values of the
		 * first N columns in the from parameter.
		 */SimpleAdapter adapter = new SimpleAdapter(this, datas,
				R.layout.list, arr, new int[] { R.id.iv_header, R.id.title,
						R.id.content });
		for (int i = 0; i < titles.length; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("title", titles[i]);
			map.put("content", contents[i]);
			map.put("header", headers[i]);
			datas.add(map);
		}
		// (4)为ListActivity设置adapter.
		lv.setAdapter(adapter);

		lv.setOnItemClickListener(new OnItemClickListener() {

			// 定义当某个选项被点击时的操作。
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(MainActivity.this,
						position + " item is clicked.", Toast.LENGTH_LONG)
						.show();

			}

		});

	}

}



1、使用SimpleAdapter与ArrayAdapter相比,它可以支持复杂的表项结构,而不只是单一的textview。

2、其创建过程的两个主要区别是:

(1)每个列表项的布局文件不一样

(2)创建SimpleAdapter的操作更为复杂,需要构建一个List<Map<String, Object>>。




posted @ 2013-11-20 10:04  eagleGeek  阅读(114)  评论(0编辑  收藏  举报