android ListView之一:Adapter介使用(转)
?
点击查看原网页
ListView是在Android很常的一,ListView不在簿中是看大量的列表料,都是用得到。
ListView的使用需要搭配Adapter,Adapter是用接料和ListView的,Adapter除了用到ListView中,另外用到有Spinner(似下拉)的元件中。在Google IO 2009的其中一投影片中,可以很清楚的看到其中的:
就可以看到Adapter基本上分成Cursor和ArrayList的。Cursor和料或目前中的料有,例如要抓出目前簿中的人料,用的就是Cursor的Adapter,而自己在程式中建立的列料,用的就是ArrayList的Adapter。最常用的有Adapter:- ArrayAdapter:一到ListView
- SimpleAdapter:用於自ListView外的用合
- BaseAdapter:抽象,所以有多方法需要作。用於需要自ListView外等活用的合。
- SimpleCursorAdapter:一有的料或人等ContentProvider的料查的果到ListView中首先,要使用ListView可以用ListViewUI件,放置到目前的Activity中。另一可以用的方式,是直接承ListActivity,是一Activity的子,其中就包含一全幕的ListView物件。ListActivity用法比:
1234567891011121314151617181920212223242526
public class ListDemo1 extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);? //注意:不能使用main中的layout,用了出 //setContentView(R.layout.main);? setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings));? //用按功能 getListView().setTextFilterEnabled(true); }? private static final String[] mStrings = new String[] { "大包小", "蚵仔煎", "山", "臭豆腐", "", "豆花", "青蛙下蛋","血糕", "大包小", "水", "烤香","","珍珠奶茶","酥","大狗", "炸排","山肉","花生冰","冰","水果冰", "包心粉","排骨酥","沙茶","章","度小月", "aaa","abc","bbb","bcd","123" };}?
第8行:是照一般的Activity中有的setContentView方法,因是ListActivity所以不需要,用了也有息。第10行:用setListAdapter方法定一ArrayAdapter第14行:按功能,因List中的目有可能很多,像例你按下中的a,就出以a的目,方便找到目第18~25行:一些要放到List中的字串值假是在Activity中除了ListView之外,要放入其他的件,候就需要在Activity中加入一ListView件,利用件的setAdapter接Adapter,例如下:12345678910111213141516171819202122232425262728
public class ListDemo2 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);? //使用main中的layout setContentView(R.layout.main); //找到listview件 ListView list = (ListView) findViewById(R.id.listView1);? //listview物件使用setAdapter方法(比ListActivity是用setListAdapter) list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings));? //用按功能(直接用listview物件,不需要getListView方法) list.setTextFilterEnabled(true); }? private static final String[] mStrings = new String[] { "大包小", "蚵仔煎", "山", "臭豆腐", "", "豆花", "青蛙下蛋","血糕", "大包小", "水", "烤香","","珍珠奶茶","酥","大狗", "炸排","山肉","花生冰","冰","水果冰", "包心粉","排骨酥","沙茶","章","度小月", "aaa","abc","bbb","bcd","123" };}?
值得一提的是在ArrayAdapter中有一android定好的建list式?- "android.R.layout.simple_list_item_1",注意不是我定的,在android系中就有存在了。其中常用的的些式如下所列:- android.R.layout.simple_list_item_1:一行text
- android.R.layout.simple_list_item_2:一行text大,一行text小
- android.R.layout.simple_list_item_single_choice:
- android.R.layout.simple_list_item_multiple_choice:多按
- android.R.layout.simple_list_item_checked:勾盒
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
public class ListDemo3 extends ListActivity { /** Called when the activity is first created. */ ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); private SimpleAdapter adapter;? @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);? //把料加入ArrayList中 for(int i=0; i<mPlaces.length; i++){ HashMap<String,String> item = new HashMap<String,String>(); item.put( "food", mFoods[i]); item.put( "place",mPlaces[i] ); list.add( item ); }? //新增SimpleAdapter adapter = new SimpleAdapter( this, list, android.R.layout.simple_list_item_2, new String[] { "food","place" }, new int[] { android.R.id.text1, android.R.id.text2 } );? //ListActivity定adapter setListAdapter( adapter );? //用按功能,行料都行 getListView().setTextFilterEnabled(true); }? private static final String[] mPlaces = new String[] { "台北市", "新北市", "台南市", "高雄市", "苗粟", "台北市", "新北市", "台南市", "高雄市", "苗粟", "台北市", "新北市", "台南市", "高雄市", "苗粟", "台北市", "新北市", "台南市", "高雄市", "苗粟", "台北市", "新北市", "台南市", "高雄市", "苗粟", "台北市", "新北市", "789", "cde", "abc" };? private static final String[] mFoods = new String[] { "大包小", "蚵仔煎", "山", "臭豆腐", "", "豆花", "青蛙下蛋","血糕", "大包小", "水", "烤香","","珍珠奶茶","酥","大狗", "炸排","山肉","花生冰","冰","水果冰", "包心粉","排骨酥","沙茶","章","度小月", "aaa","abc","bbb","bcd","123" };}?
行的果如下:
如果不要用android附的simple_list_item_2,改用自己定的式,要怎作呢?像上面的例,再加上一分的字串在地的旁。首先先作一List的目用的layout,如下的xml,取名mylistview1.xml。123456789101112131415161718192021222324252627282930313233
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" android:orientation="vertical"> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:layout_marginTop="6dip" android:textAppearance="?android:attr/textAppearanceLarge"> </TextView> <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/linearLayout1" android:orientation="horizontal"> <TextView android:id="@+id/textView2" android:text="TextView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall"> </TextView> <TextView android:text="TextView" android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_marginLeft="6dip"> </TextView> </LinearLayout></LinearLayout>?
?
接下要改一下程式,改用自己定的item layout,利用R.java面的定就行了(下面程式省略了ratingsting array的定,得加上):12345678910111213141516
//把料加入ArrayList中 for(int i=0; i<mPlaces.length; i++){ HashMap<String,String> item = new HashMap<String,String>(); item.put( "food", mFoods[i]); item.put( "place","地:"+mPlaces[i] ); item.put("rating", "分:"+mRatings[i]+" 星"); list.add( item ); }? //新增SimpleAdapter adapter = new SimpleAdapter( this, list, R.layout.mylistview1, new String[] { "food","place","rating" }, new int[] { R.id.textView1, R.id.textView2, R.id.textView3 } );?
?行的果如下:
下一步,加上 片吧…片很有真相,片需要先放到res/drawable-xxxx目中(只有放到res/drawable-hdpi中),抓取片用R.drawable.pic,不因HashMap的value部份需要用片(R.drawable.pic),是一int的型,所以HashMap的value部份需要改Object,才能容得下int和string的型。先用於list的目用的layout改一下,加上片在的左:
1234567891011121314151617181920212223242526272829303132333435363738394041
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/linearLayout1" > <ImageView android:layout_height="wrap_content" android:id="@+id/imageView1" android:layout_width="wrap_content" android:src="@drawable/icon"></ImageView> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:layout_marginTop="6dip" android:textAppearance="?android:attr/textAppearanceLarge"> </TextView> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/linearLayout1" android:orientation="horizontal"> <TextView android:id="@+id/textView2" android:text="TextView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall"> </TextView> <TextView android:text="TextView" android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_marginLeft="6dip"> </TextView> </LinearLayout></LinearLayout>?
?
再要改一下程式,加上片和改Hashmap的value型Object(部份程式):12345678910111213141516171819202122232425262728293031323334353637383940
ArrayList<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>(); private SimpleAdapter adapter;? @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);? //把料加入ArrayList中 for(int i=0; i<mPlaces.length; i++){ HashMap<String,Object> item = new HashMap<String,Object>(); item.put("pic", mPics[i]); item.put( "food", mFoods[i]); item.put( "place","地:"+mPlaces[i] ); item.put("rating", "分:"+mRatings[i]+" 星"); list.add( item ); }? //新增SimpleAdapter adapter = new SimpleAdapter( this, list, R.layout.mylistview2, new String[] { "pic","food","place","rating" }, new int[] { R.id.imageView1, R.id.textView1, R.id.textView2, R.id.textView3 } );? //ListActivity定adapter setListAdapter( adapter );? //用按功能,行都行 getListView().setTextFilterEnabled(true); } private static final int[] mPics=new int[]{ R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5, R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5, R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5, R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5, R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5, R.drawable.pic1,R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,R.drawable.pic5 };...?
?行的果如下:
到得篇幅有多了,只是把一些基本的listview示料的方式下而已,真正始行操作。以上片和文字供考。?
如果不要用android附的simple_list_item_2,改用自己定的式,要怎作呢?像上面的例,再加上一分的字串在地的旁。首先先作一List的目用的layout,如下的xml,取名mylistview1.xml。
到得篇幅有多了,只是把一些基本的listview示料的方式下而已,真正始行操作。以上片和文字供考。