Android ListView例子详解
fmms
12年前
<p>三种实现方法,由浅入深。这中间要注意Adapter的用法,其实你要是看过Android的文档,你会发现有很多Adapter,</p> <p>如果你还不太清楚适配器模式,可以先补补这方面的知识。在实际工作中,设计模式是个很好的帮手。</p> <p>两个layout文件:</p> <p>main.xml</p> <p></p> <pre class="brush:html; toolbar: true; auto-links: false;"><?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></pre> <p></p> <p>listview.xml</p> <p></p> <pre class="brush:html; toolbar: true; auto-links: false;"><?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> </pre> <br /> Activity:LincListViewActivity.java <p></p> <p></p> <pre class="brush:java; toolbar: true; auto-links: false;">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); } }</pre> <br /> 数据类对象:Zhang.java <p></p> <p></p> <pre class="brush:java; toolbar: true; auto-links: false;">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 + "]"; } } </pre> <br /> 适配器类:ListAdapter.java <p></p> <p></p> <pre class="brush:java; toolbar: true; auto-links: false;">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 stub this.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; } }</pre> <br /> 更复杂的一个例子: <a href="/misc/goto?guid=4959500378513257662">单行与多行并存</a> <p></p> <p>还可以参考:<a href="/misc/goto?guid=4959500378621196318">View Tag的介绍</a></p> <p></p> <p style="padding-bottom:2px;margin:4px 0px;padding-left:0px;padding-right:0px;padding-top:2px;">或者对比着GridView来学习一下它们的异同,<a href="/misc/goto?guid=4959500378710896581">Android自定义GridView之实现一个图片加多个文本框</a></p> <p style="padding-bottom:2px;margin:4px 0px;padding-left:0px;padding-right:0px;padding-top:2px;">它们的Adapter一个是继承自ArrayAdapter,另一个是BaseAdapter。</p> <br />