Wednesday, January 9, 2013

自定義ListView注意到的問題

http://blog.joomla.org.tw/android/178-ListView%E4%B9%8B%E4%B8%80%EF%BC%9AAdapter%E4%BB%8B%E7%B4%B9%E8%88%87%E4%BD%BF%E7%94%A8.html

如果Activity有繼承ListActivity
是不可以使用
setContentView(R.layout.list);
這個函式(會出錯)

被網路上一些文章誤導 =.=


列表(ListView)的應用上,很少是簡簡單單而已xd,很多都是要加東加西,又是加圖片

又是加標題、加內容的,所以事情很常不是我們想的那麼簡單的xd,這時就一定要用到

自定義這個東西,自定義顧名思義就是隨便您定,只要您高興、您開心,愛怎麼定都可以

方便是很方便,不過相對的會比較複雜一些,既然會需要用到,那我們就來看看怎麼做吧!

首先想要自定義的都需要多一個模板,所以新增一個List.xml

adapter.xml
  1.  version="1.0" encoding="utf-8"?>
  2.  xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="horizontal"
  4.    android:layout_width="fill_parent"
  5.    android:layout_height="fill_parent">
  6.     
  7.        android:id="@+id/MyAdapter_ImageView_icon"
  8.        android:layout_width="110dp"
  9.        android:layout_height="70dp"
  10.        android:layout_centerVertical="true"
  11.        android:layout_marginLeft="5dp"
  12.    />
  13.   android:orientation="vertical"
  14.        android:layout_width="wrap_content"
  15.        android:layout_height="wrap_content">
  16.      
  17.         android:id="@+id/MyAdapter_TextView_title"
  18.         android:layout_width="wrap_content"
  19.         android:layout_height="wrap_content"
  20.         android:layout_marginLeft="20dp"
  21.         android:textColor="#ffbf00" />
  22.        
  23.     
  24.        android:id="@+id/MyAdapter_TextView_info"
  25.        android:layout_width="wrap_content"
  26.        android:layout_height="wrap_content"
  27.        android:layout_marginLeft="15dp"
  28.        android:textColor="#FFFFFFFF" />
  29.   
>  

  • 新增一個適配器,也是資料的橋接器MyAdapter,說明資料應該對應到模板的哪個位置
    MyAdapter.java


    1. package jim.demo.listview;
    2. import android.content.Context;
    3. import android.view.LayoutInflater;
    4. import android.view.View;
    5. import android.view.ViewGroup;
    6. import android.widget.BaseAdapter;
    7. import android.widget.ImageView;
    8. import android.widget.TextView;
    9. public class MyAdapter extends BaseAdapter {
    10.     private LayoutInflater myInflater;
    11.     CharSequence[] title = null;
    12.     CharSequence[] info = null;
    13.      
    14.     public MyAdapter(Context ctxt, CharSequence[] title, CharSequence[] info){
    15.         myInflater = LayoutInflater.from(ctxt);
    16.         this.title = title;
    17.         this.info = info;
    18.     }
    19.      
    20.     @Override
    21.     public int getCount() {
    22.          return title.length;
    23.     }
    24.     @Override
    25.     public Object getItem(int position) {
    26.          return title[position];
    27.     }
    28.     @Override
    29.     public long getItemId(int position) {
    30.          return position;
    31.     }
    32.     @Override
    33.     public View getView(int position, View convertView, ViewGroup parent) {
    34.         //自訂類別,表達個別listItem中的view物件集合。
    35.         ViewTag viewTag;
    36.         if(convertView == null){
    37.             //取得listItem容器 view
    38.             convertView = myInflater.inflate(R.layout.adapternull);
    39.              
    40.             //建構listItem內容view
    41.             viewTag = new ViewTag(
    42.             (ImageView)convertView.findViewById(R.id.MyAdapter_ImageView_icon),
    43.             (TextView) convertView.findViewById(R.id.MyAdapter_TextView_title),
    44.             (TextView) convertView.findViewById(R.id.MyAdapter_TextView_info)
    45.              );
    46.              
    47.             //設置容器內容
    48.             convertView.setTag(viewTag);
    49.         }
    50.         else{
    51.             viewTag = (ViewTag) convertView.getTag();
    52.         }
    53.          
    54.         //設定內容圖案
    55.         switch(position){
    56.             case 0:
    57.                 viewTag.icon.setBackgroundResource(R.drawable.taipei);
    58.                 break;
    59.             case 1:
    60.                 viewTag.icon.setBackgroundResource(R.drawable.taichung);
    61.                 break;
    62.             case 2:
    63.                 viewTag.icon.setBackgroundResource(R.drawable.kaohsiung);
    64.                 break;
    65.         }
    66.          
    67.         //設定標題文字
    68.         viewTag.title.setText(title[position]);
    69.         //設定內容文字
    70.         viewTag.info.setText(info[position]);
    71.          
    72.         return convertView;
    73.     }
    74.     //自訂類別,表達個別listItem中的view物件集合。
    75.     class ViewTag{
    76.         ImageView icon;
    77.         TextView title;
    78.         TextView info;
    79.      
    80.         public ViewTag(ImageView icon, TextView title, TextView info){
    81.             this.icon = icon;
    82.             this.title = title;
    83.             this.info = info;
    84.         }
    85.     }
    86. }
    新增一個適配器,也是資料的橋接器MyAdapter,說明資料應該對應到模板的哪個位置
    MyAdapter.java
    1. package jim.demo.listview;
    2. import android.app.ListActivity;
    3. import android.os.Bundle;
    4. public class DemoListViewActivity extends ListActivity {
    5.      
    6.     private String[] mtitle = new String[]{"台北","台中","高雄"} ;
    7.     private String[] minfo =  new String[]{"台北101.故公博物院.中正記念堂","都會公園.高美濕地.大坑風景區","西子灣.英國領事館.愛河"};
    8.       
    9.     @Override
    10.     public void onCreate(Bundle savedInstanceState) {
    11.         super.onCreate(savedInstanceState);
    12.         setContentView(R.layout.main);
    13.                  
    14.         //標題資料
    15.         CharSequence[] Mtitle = mtitle;
    16.         //內容
    17.         CharSequence[] Minfo = minfo;
    18.         //載入列表中,new出MyAdapter時帶入所需"標題"."內容"資料
    19.         setListAdapter(new MyAdapter(this, Mtitle, Minfo));
    20.          
    21.     }
    22. }
    執行後畫面


    後記:
               自定義ListView的重點在於adapter.xml這個模板及MyAdapter.java這個適配器
    只要修改模板及適配器就能做出自己想要的列表形式,這個對剛接觸android程式設計
    的人來說可能會有點不太習慣這樣的設計模式,但android很多地方都是這種設計模式的
    只要是自定義的地方,大多都會是此種形式,就為你介紹到此,謝謝。

    No comments:

    Post a Comment