Android之ListView

我叫阿狸貓發表於2014-01-20
ListView
         1.三種Adapter構建ListView
                ListView新增條目的時候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三種
                BaseAdapter: 定義一個類繼承BaseAdapter, 重寫4個抽象方法, ListView的條目是由getView()方法構建出來的
                SimpleAdapter: 建立SimpleAdapter物件時, 傳入資料(List<Map<String, ?>>), 並指定資料的繫結關係

                SimpleCursorAdapter: 建立SimpleCursorAdapter物件時, 傳入一個Cursor, 指定資料的繫結關係

          2.監聽ListView的點選
呼叫ListView.setOnItemClickListener(OnItemClickListener)方法註冊一個監聽器
在監聽器的onItemClick()方法中使用 parent.getItemAtPosition(position) 方法可以獲取指定條目上的資料
BaseAdapter:返回的就是自定義的getItem()方法中返回的資料
SimpleAdapter:返回的是一個Map, 就是建立SimpleAdapter時List中的一個Map
SimpleCursorAdapter:返回的是一個Cursor, 這個Cursor就是建立時傳入的Cursor, 但是已經通過moveToPosition()方法指定到點選的索引了

一:BaseAdapter新增方式:
1.查詢出要被新增的資料
2.獲取ListView物件
3.建立一個類繼承BaseAdapter,實現其中的方法
4.給ListView物件設定介面卡personLV.setAdapter(new MyBaseAdapter());

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;

/**
 * 注意:
 * 	BaseAdapter生成的條目,進行Item點選事件監聽的時候,
 *  parent.getItemAtPosition(position)返回的是person物件
 *  因為呼叫的是生成條目物件MyBaseAdapter類中的getItem方法
 *   
 */
public class BaseAdapterActivity extends Activity {
    private ListView personLV;
	private List<Person> persons;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        PersonDao dao = new PersonDao(getApplicationContext());
        persons = dao.queryAll();//查詢資料
        
        
        personLV = (ListView) findViewById(R.id.personLV);//獲取ListView
        personLV.setAdapter(new MyBaseAdapter());//給ListView新增介面卡,按照adapter中的方法對ListView新增條目
        
        personLV.setOnItemClickListener(new MyOnItemClickListener());//給條目新增條目點選監聽器
    }
    
    /**
     * 點選事件監聽器
     */
    private class MyOnItemClickListener implements OnItemClickListener {
		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Person p = (Person) parent.getItemAtPosition(position);//其實就是呼叫了MyBaseAdapter中的getItem方法,返回指定條目上的資料
			Toast.makeText(getApplicationContext(), p.getId()+","+p.getName()+","+p.getBalance(), Toast.LENGTH_SHORT).show();
		}
    }
    
    /**
     * 將每個Person物件生成一個條目,將每個條目新增到ListView中
     */
    private class MyBaseAdapter extends BaseAdapter {
		public int getCount() {//返回ListView中要顯示的條目數量(說白了就是,person集合元素的個數)
			return persons.size();
		}
		public Object getItem(int position) {//返回指定位置上的物件
			return persons.get(position);
		}
		public long getItemId(int position) {//返回條目的id,從0開始
			return position;
		}
		//返回指定位置上的View,新增到ListView中,也就是說Person集合有幾個元素就呼叫這個方法幾次,一次生成一個條目
		public View getView(int position, View convertView, ViewGroup parent) {//因為螢幕最多顯示10個條目,上下移動的時候都是移動的時候建立的,而不是一次建立完的,convertView代表移出螢幕外的那個條目
			Person person = persons.get(position);
			/*
			 * inflate充氣的意思,理解為構建一個條目
			 * 引數一:上下文環境
			 * 引數二:item的佈局檔案
			 * 引數三:將item掛到哪個元件上,如果寫null,預設掛到ListView上
			 */
			/**
			 * 千萬要注意:
			 * 此時SQLiteNewActivity類中使用findViewById並不能找到條目中的id,name,balance元件
			 * 因為此時還沒載入到Activity中
			 * 所以需要靠item(條目)來獲取條目裡的元件
			 * item.findViewById
			 * 
			 */
			View item = View.inflate(getApplicationContext(), R.layout.item, null);
			TextView idTV = (TextView) item.findViewById(R.id.idTV);
			TextView nameTV = (TextView) item.findViewById(R.id.nameTV);
			TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV);
			
			/**
			 * 千萬要注意:
			 * setText(CharSequence text)
			 * setText(int resid)
			 * 這個方法有過載,如果傳入int型別的值進去(比如person的id和balance)
			 * 程式會去找R檔案中內部類string中的值,所以肯定找不到
			 * 因此setText的時候務必轉成字串
			 */
			idTV.setText(person.getId()+"");
			nameTV.setText(person.getName());
			balanceTV.setText(person.getBalance()+"");
			return item;
		}
    }
}



二.SimpleAdapter新增方式:

         1.查詢出要被新增的資料
         2.建立一個Map元素的List集合    List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
         3.遍歷需要被新增的資料,將資料以鍵值對的方式加入到map集合中,再將Map集合加入到List集合
         4.獲取ListView物件   ListView personLV = (ListView) findViewById(R.id.personLV);
         5.給ListView設定介面卡 

personLV.setAdapter(new SimpleAdapter(this, data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
/* SimpleAdapter傳入指定的資料和佈局檔案,以及匹配關係,自動生成View,裝入LsitView
 * 引數一:上下文環境
 * 引數二:資料,List<Map<String,Object>>,每個Person的資料裝入一個Map,將所有Map裝入List
 * 引數三:佈局檔案的資源id,因為每個條目也有自己的佈局方式,這個佈局指的是每個item的佈局
 * 引數四:Map中的key,和引數五中的id所對應的元件對應,將指定Key對應的Value,放入id對應的元件上
 * 引數五:View中的id
 */

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

import android.app.Activity;
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 com.xxc.dao.PersonDao;
import com.xxc.domain.Person;

/**
 * 注意:
 * 	SimpleAdapter生成的條目,進行Item點選事件監聽的時候,
 *  parent.getItemAtPosition(position)返回的是map集合
 *
 */
public class SimpleAdapterActivity extends Activity {
    private ListView personLV;
	private List<Person> persons;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        PersonDao dao = new PersonDao(getApplicationContext());
        persons = dao.queryAll();//查詢資料
        
        
        personLV = (ListView) findViewById(R.id.personLV);//獲取ListView
        List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
      //把每個Person的資料裝入一個map,再將所有map裝入list
        for (Person p : persons) {
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("id", p.getId());
			map.put("name", p.getName());
			map.put("balance", p.getBalance());
			data.add(map);
		}
		/*
         * 引數一:上下文環境
         * 引數二:遍歷Person集合,將一個Person物件資料裝入Map集合,再將所有Map集合裝入List集合中
         * 引數三:生成條目的佈局檔案
         * 引數四:map中的key  
         * 引數五:條目中的元件id
         * 引數四和引數五的意思是:
         * 			根據key去找map集合找到對應的value值,將value放到引數五中的元件中(先後順序)
         */
        personLV.setAdapter(new SimpleAdapter(getApplicationContext(), data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
        
        
        personLV.setOnItemClickListener(new MyOnItemClickListener());//給條目新增條目點選監聽器
    }
    
    /**
     * 點選事件監聽器
     */
    private class MyOnItemClickListener implements OnItemClickListener {
		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Map<String,Object> map =  (Map<String, Object>) parent.getItemAtPosition(position);//其實就是呼叫了MyBaseAdapter中的getItem方法,返回Map
			Toast.makeText(getApplicationContext(), map.get("name").toString(), Toast.LENGTH_SHORT).show();
		}
    }
}



三:SimpleCursorAdapter

1.查詢出要被新增的資料,返回的是一個Cursor型別物件

2.獲取ListView物件

3.在ListView上設定介面卡

注意:查詢出來的主鍵必須以_id命名,最好就是資料庫表中的主鍵列名就是_id,如果不能改變,就在查詢的時候取別名。


dao層

/**
 * 查詢person表中所有記錄,返回 Cursor型別
 */
public Cursor queryAllCursor(){
	SQLiteDatabase db = helper.getReadableDatabase();
	Cursor c = db.query("person", new String[]{"id _id ","name","balance"}, null, null, null, null, "id DESC");
	return c;
}

Activity

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.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class SimpleCursorAdapterActivity extends Activity {
    private ListView personLV;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        PersonDaoNew dao = new PersonDaoNew(getApplicationContext());
        Cursor c = dao.queryAllCursor();
        
        personLV = (ListView) findViewById(R.id.personLV);
        personLV.setAdapter(new SimpleCursorAdapter(this, R.layout.item, c,//
        				new String[]{"_id","name","balance"}, //
        				new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));//
        /*
         *引數一:上下文環境
         *引數二:佈局檔案資源ID
         *引數三:包含資料的遊標
         *引數四:遊標中的列名
         *引數五:條目中的元件ID,遊標中的資料就會放在這些元件上 
         */
    	personLV.setOnItemClickListener(new MyOnItemClickListener());//新增監聽器
    }
    //監聽器的實現類
    private class MyOnItemClickListener implements OnItemClickListener{
		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Cursor c = (Cursor) parent.getItemAtPosition(position);
			Toast.makeText(getApplicationContext(), c.getString(0), Toast.LENGTH_SHORT).show();
		}
    }
}

item.xml  條目的佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:padding="10dp">

    <TextView
        android:id="@+id/idTV"
        android:textSize="20sp"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="1" />

    <TextView
        android:layout_weight="2"
        android:id="@+id/nameTV"
        android:layout_width="0dp"
        android:textSize="20sp"
        android:layout_height="wrap_content"
        android:text="皮卡丘" />

    <TextView
        android:layout_weight="2"
        android:id="@+id/balanceTV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="1000"
        android:textSize="20sp" />
	
</LinearLayout>

main.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="vertical" >
	
    <!-- 這個是表頭的設定,下面拖動,表頭不會動 -->
    <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:padding="10dp">

    <TextView
        android:textSize="20sp"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="序號" />

    <TextView
        android:layout_weight="2"
        android:layout_width="0dp"
        android:textSize="20sp"
        android:layout_height="wrap_content"
        android:text="姓名" />

    <TextView
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="餘額"
        android:textSize="20sp" />
	
	</LinearLayout>
	<!-- 這個是表頭的設定,下面拖動,表頭不會動 -->
    
   	<ListView 
   	    android:id="@+id/personLV"
   	    android:layout_width="fill_parent"
    	android:layout_height="fill_parent"/>

</LinearLayout>




四:ArrayAdapter

最簡單的資料介面卡


Activity

package com.xxc.day4;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView array_lv = (ListView) findViewById(R.id.array_lv);
		String[] objs = new String[]{"王立軍1","王立軍2","王立軍3","王立軍4","王立軍5","王立軍6"};
		/**
		 * 引數一:上下文
		 * 引數二:資原始檔,是一個TextView,由android自己定義的
		 * 引數三:要顯示的資料
		 */
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, objs);
		array_lv.setAdapter(adapter);
	}
}

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/array_lv" 
        android:layout_width="match_parent"
    	android:layout_height="match_parent">
    </ListView>
</LinearLayout>



相關文章