三種實現方法,由淺入深。這中間要注意Adapter的用法,其實你要是看過Android的文檔,你會發現有很多Adapter,
如果你還不太清楚適配器模式,可以先補補這方面的知識。在實際工作中,設計模式是個很好的幫手。
兩個layout檔案:
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" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" ></ListView></LinearLayout>
listview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linerlayout1" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" > <TextView android:id="@+id/person_name" android:textSize="23sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/person_age" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/person_email" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/person_address" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
Activity:LincListViewActivity.java
package com.linc.listview;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class LincListViewActivity extends Activity {private final static String[] data = {"張飛","張遼","張角","張三丰","張牙舞爪","張燈結綵","張唑啉","張大民"};//建立資料來源. Zhang[] data2 = new Zhang[]{ new Zhang("張飛",38,"zhangfei@gmail.com","燕山"), new Zhang("張遼",36,"zhangliao@sina.com","雁門"), new Zhang("張角",51,"zhangjiao@gmail.com","钜鹿"), new Zhang("張三丰",200,"sanfeng@gmail.com","遼東"), new Zhang("張牙舞爪",25,"5zhao@gmail.com","冀州"), new Zhang("張燈結綵",25,"5zhao@gmail.com","冀州") , new Zhang("張唑啉",25,"5zhao@gmail.com","冀州") , new Zhang("張大民",25,"5zhao@gmail.com","冀州") , new Zhang("張牙舞爪",25,"5zhao@gmail.com","冀州") }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView listview = (ListView)findViewById(R.id.listview); /* * 第一種:一般字元串 */ ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,data); /* * 第二種:文藝類對象 */ ArrayAdapter<Zhang> adapter2 = new ArrayAdapter<Zhang>(this, android.R.layout.simple_list_item_1,data2); /* * 第三種:自訂配接器 */ ListAdapter adapter3 = new ListAdapter(this, R.layout.listview,data2) ; listview.setAdapter(adapter3); }}
資料類對象:Zhang.java
package com.linc.listview;public class Zhang { private String name; private int age; private String email; private String address; public String getName() {return name;}public int getAge() {return age;}public String getEmail() {return email;}public String getAddress() {return address;} public Zhang(String name, int age, String email, String address) { super(); this.name = name; this.age = age; this.email = email; this.address = address; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", email=" + email + ", address=" + address + "]"; } }
適配器類:ListAdapter.java
package com.linc.listview;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.TextView;public class ListAdapter extends ArrayAdapter<Zhang> {private LayoutInflater mInflater; public ListAdapter(Context context, int textViewResourceId,Zhang[] obj) {super(context, textViewResourceId,obj);// TODO Auto-generated constructor stubthis.mInflater = LayoutInflater.from(context);}@Override public View getView(int position, View convertView, ViewGroup parent) {if(convertView == null){ //建立新的view視圖. convertView = mInflater.inflate(R.layout.listview, null); } ViewHolder holder = null; if(holder==null){ holder = new ViewHolder(); //尋找每個ViewItem中,各個子View,放進holder中 holder.name = (TextView) convertView.findViewById(R.id.person_name); holder.age = (TextView) convertView.findViewById(R.id.person_age); holder.email = (TextView) convertView.findViewById(R.id.person_email); holder.address = (TextView) convertView.findViewById(R.id.person_address); //儲存對每個顯示的ViewItem中, 各個子View的引用對象 convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } //擷取當前要顯示的資料 Zhang person = getItem(position); holder.name.setText(person.getName()); holder.age.setText(String.valueOf(person.getAge())); holder.email.setText(person.getEmail()); holder.address.setText(person.getAddress()); return convertView; } private static class ViewHolder{TextView name; TextView age; TextView email; TextView address;}}
更複雜的一個例子:單行與多行並存
還可以參考:View Tag的介紹
或者對比著GridView來學習一下它們的異同,Android自訂GridView之實現一個圖片加多個文字框
它們的Adapter一個是繼承自ArrayAdapter,另一個是BaseAdapter。