又是加標題、加內容的,所以事情很常不是我們想的那麼簡單的xd,這時就一定要用到
自定義這個東西,自定義顧名思義就是隨便您定,只要您高興、您開心,愛怎麼定都可以
方便是很方便,不過相對的會比較複雜一些,既然會需要用到,那我們就來看看怎麼做吧!
首先想要自定義的都需要多一個模板,所以新增一個List.xml
adapter.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/MyAdapter_ImageView_icon" android:layout_width="110dp" android:layout_height="70dp" android:layout_centerVertical="true" android:layout_marginLeft="5dp" /> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/MyAdapter_TextView_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:textColor="#ffbf00" /> <TextView android:id="@+id/MyAdapter_TextView_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:textColor="#FFFFFFFF" /> </LinearLayout> </LinearLayout>
新增一個適配器,也是資料的橋接器MyAdapter,說明資料應該對應到模板的哪個位置
MyAdapter.java
package jim.demo.listview; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class MyAdapter extends BaseAdapter { private LayoutInflater myInflater; CharSequence[] title = null; CharSequence[] info = null; public MyAdapter(Context ctxt, CharSequence[] title, CharSequence[] info){ myInflater = LayoutInflater.from(ctxt); this.title = title; this.info = info; } @Override public int getCount() { return title.length; } @Override public Object getItem(int position) { return title[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //自訂類別,表達個別listItem中的view物件集合。 ViewTag viewTag; if(convertView == null){ //取得listItem容器 view convertView = myInflater.inflate(R.layout.adapter, null); //建構listItem內容view viewTag = new ViewTag( (ImageView)convertView.findViewById(R.id.MyAdapter_ImageView_icon), (TextView) convertView.findViewById(R.id.MyAdapter_TextView_title), (TextView) convertView.findViewById(R.id.MyAdapter_TextView_info) ); //設置容器內容 convertView.setTag(viewTag); } else{ viewTag = (ViewTag) convertView.getTag(); } //設定內容圖案 switch(position){ case 0: viewTag.icon.setBackgroundResource(R.drawable.taipei); break; case 1: viewTag.icon.setBackgroundResource(R.drawable.taichung); break; case 2: viewTag.icon.setBackgroundResource(R.drawable.kaohsiung); break; } //設定標題文字 viewTag.title.setText(title[position]); //設定內容文字 viewTag.info.setText(info[position]); return convertView; } //自訂類別,表達個別listItem中的view物件集合。 class ViewTag{ ImageView icon; TextView title; TextView info; public ViewTag(ImageView icon, TextView title, TextView info){ this.icon = icon; this.title = title; this.info = info; } } }
再來當然是我們的主程式DemoListViewActivity
修改繼承自ListActivity,也可以不改變繼承,延用預設的Activity
只是還要用findViewById去找到該ListView再把資料載入而已
如果您的頁面上只是很單純的一個ListView,就直接用ListActivity會比較快
MyAdapter.java
package jim.demo.listview; import android.app.ListActivity; import android.os.Bundle; public class DemoListViewActivity extends ListActivity { private String[] mtitle = new String[]{"台北","台中","高雄"} ; private String[] minfo = new String[]{"台北101.故公博物院.中正記念堂","都會公園.高美濕地.大坑風景區","西子灣.英國領事館.愛河"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //標題資料 CharSequence[] Mtitle = mtitle; //內容 CharSequence[] Minfo = minfo; //載入列表中,new出MyAdapter時帶入所需"標題"."內容"資料 setListAdapter(new MyAdapter(this, Mtitle, Minfo)); } }
執行後畫面
後記:
自定義ListView的重點在於adapter.xml這個模板及MyAdapter.java這個適配器
只要修改模板及適配器就能做出自己想要的列表形式,這個對剛接觸android程式設計
的人來說可能會有點不太習慣這樣的設計模式,但android很多地方都是這種設計模式的
只要是自定義的地方,大多都會是此種形式,就為你介紹到此,謝謝。
不好意思,我把三個程式碼都複製貼上,但是有錯,可以幫們一下嗎
回覆刪除原來是list的名字沒有改 android:id="@android:id/list" ,哈XD
回覆刪除