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 />