1. 程式人生 > >九、android的ListView實現資料列表展示

九、android的ListView實現資料列表展示

基於上一篇第八節的資料庫操作為基礎,對資料庫中的內容在android介面上進行列表展示

1、工程結構:


列表顯示示意圖:


列表顯示效果圖:


2、介面的列表展示配置檔案

item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"  
  android:orientation="horizontal" ><!-- 使用線性佈局,預設不寫的話是線性佈局 -->
  
  <TextView
  android:layout_width="120dp"
  android:textSize="22sp"
  android:layout_height="wrap_content"
  android:id="@+id/name"
  />
  
   <TextView
  android:layout_width="150dp"
   android:textSize="22sp"
  android:layout_height="wrap_content"
  android:id="@+id/id"
  />
  
  <TextView
  android:layout_width="fill_parent"
   android:textSize="22sp"
  android:layout_height="wrap_content"
  android:id="@+id/age"
  />
</LinearLayout>

main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
<LinearLayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">
  	  
	   <TextView
	  android:layout_width="150dp"
	  android:layout_height="wrap_content"
	   android:text="@string/id"
	  />
	   
	  <TextView
	  android:layout_width="120dp"
	  android:layout_height="wrap_content"
	  android:text="@string/name"
	  />
	  
	  <TextView
	  android:layout_width="fill_parent"
	  android:layout_height="wrap_content"
	  android:text="@string/age"
	  />
</LinearLayout>
    
<ListView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/listView"  />
</LinearLayout>

3、數值配置檔案
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, MainActivity!</string>
    <string name="app_name">資料庫應用</string>
    <string name="id">編號</string>
    <string name="name">姓名</string>
    <string name="age">年齡</string>
</resources>

4、Activity的介面顯示編碼
package cn.huangjie.db;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import cn.huangjie.adapter.PersonAdapter;
import cn.huangjie.domain.Person;
import cn.huangjie.service.PersonService;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class DbActivity extends Activity {
    private ListView listView;
    private PersonService personService;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        personService = new PersonService(this);
        listView = (ListView) this.findViewById(R.id.listView);
        listView.setOnItemClickListener(new ItemClickListener());//針對條目的點選事件,就是顯示列表的每一行
        show2();
    }
    
    /**
     * 針對條目的點選事件
     */
    private final class ItemClickListener implements OnItemClickListener{

    	/**
    	 * view:當前所點選條目的view物件
    	 * position:當前所點選的條目它所繫結的資料在集合中的索引值
    	 */
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			ListView lView = (ListView) parent;
			/*針對show3()的顯示
			Person person = (Person) lView.getItemAtPosition(position);
			Toast.makeText(getApplicationContext(), person.getName(),
					Toast.LENGTH_SHORT).show();*/
			//針對show2的顯示
			Cursor cursor = (Cursor) lView.getItemAtPosition(position);
			Toast.makeText(getApplicationContext(), cursor.getString(cursor.getColumnIndex("name")),
					Toast.LENGTH_SHORT).show();
		}
    	
    }
    
    /**
     * 自定義介面卡
     */
    private void show3() {
		List<Person> persons = personService.getScrollData(0, 15);
		PersonAdapter adapter = new PersonAdapter(this, persons, R.layout.item);
		listView.setAdapter(adapter);
	}

    /**
     * 使用帶有遊標的簡單介面卡顯示條目列表
     */
	private void show2() {
		Cursor cursor = personService.getCursorScrollData(0, 20);
		//使用CursorAdapter在查詢結果的名稱中必須要有一個"_id"的欄位,否則沒法工作
		/**
		 * 第一種方案:增加或修改資料的欄位使表中有一個"_id"的欄位
		 * 第二種方案:修改查詢語句,使用別名方式
		 */
		CursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, 
				new String[]{"_id", "name", "age"}, new int[]{R.id.id, R.id.name, R.id.age});
		listView.setAdapter(adapter);
	}
	
	/**
	 * 使用簡單介面卡顯示條目列表
	 */
	private void show(){
    	List<Person> persons = personService.getScrollData(0, 10);
    	//需要 用到介面卡,介面卡的作用是實現資料的繫結,把資料繫結到條目的顯示控制元件上
    	List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
    	
    	for(Person person : persons){
    		HashMap<String, Object> item = new HashMap<String, Object>();
    		//存放資料的key自定義.名字隨便取
    		item.put("id", person.getId());
    		item.put("name", person.getName());
    		item.put("age", person.getAge());
    		data.add(item);
    	}
    	//第三個引數指定資料繫結在哪個條目介面上
    	SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, 
    			new String[]{"id", "name", "age"}, new int[]{R.id.id, R.id.name, R.id.age});
    	listView.setAdapter(adapter);
    	//根據手機視窗的高度和條目的高度,可以計算出該視窗展示的條目數量
    	/*內部的操作程式碼:
    	int total = adapter.getCount();
    	int perpage = 7;//顯示每頁展示的個數
    	for(int i=0; i<perpage; i++){
    		//得到條目的視窗view物件,第二個引數為快取的view(以前建立的view)
    		View view = adapter.getView(i, convertView, parent);
    		//顯示條目
    	}*/
    }
    
   
}

5、自定義介面卡顯示
package cn.huangjie.adapter;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import cn.huangjie.db.R;
import cn.huangjie.domain.Person;

/**
 * 自定義介面卡
 * @author user
 */
public class PersonAdapter extends BaseAdapter{

	private List<Person> persons;//在繫結的資料
	private int resource;//資料繫結在哪個資源介面上
	private LayoutInflater inflater;//佈局填充器,可以使用xml檔案來生成它的view物件
	
	public PersonAdapter(Context context, List<Person> persons, int resource){
		this.persons = persons;
		this.resource = resource;
		//得到系統內建的佈局填充服務
		inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	public int getCount() {
		return persons.size();//資料總數
	}

	//外面給定一個索引值,就可以得到該索引對應的元素
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return persons.get(position);
	}

	//取得條目的id
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	/**
	 * listView在顯示第一頁/屏的時候會把物件new出來,再顯示第二頁的時候重用
	 * 第一頁的view物件,具有快取功能
	 * position表示該條目所要繫結的資料所取得的索引值
	 */
	public View getView(int position, View convertView, ViewGroup parent) {
		TextView idView = null;
		TextView nameView = null;
		TextView ageView = null;
		if(convertView == null){//為第一頁顯示,建立view物件
			convertView = inflater.inflate(resource, null);//null沒有根元素
			idView = (TextView) convertView.findViewById(R.id.id);
			nameView = (TextView) convertView.findViewById(R.id.name);
			ageView = (TextView) convertView.findViewById(R.id.age);
			ViewCache cache = new ViewCache();
			cache.idView = idView;
			cache.nameView = nameView;
			cache.ageView = ageView;
			//存放在標誌裡當作快取使用
			convertView.setTag(cache);
		}else{
			ViewCache cache = (ViewCache) convertView.getTag();
			idView = cache.idView;
			nameView = cache.nameView;
			ageView = cache.ageView;
		}
		Person person = persons.get(position);
		idView.setText(person.getId().toString());
		nameView.setText(person.getName());
		ageView.setText(person.getAge().toString());

		return convertView;
	}
	
	/**
	 * 該類用於快取View物件,第一頁的時候進行建立,第二頁資料的時候使用快取
	 * 這種寫法的另一個優點是程式碼數量少佔用記憶體小,另一種是set/get方法
	 */
	private final class ViewCache{
		public TextView idView;
		public TextView nameView;
		public TextView ageView;
	}
}

工程下載地址:http://download.csdn.net/detail/wxwzy738/6316051