fragment已經(jīng)是目前應(yīng)用使用的主流了诫钓,今天來(lái)看看怎么來(lái)fragment中顯示listview——即ListFragment的使用
1逢防、創(chuàng)建CrimeListFragment繼承于ListFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}```
不同于Fragment托管到activity画机,ListFragment不用調(diào)用onCreateView(...)方法來(lái)生成布局帅腌,因?yàn)樵擃怢istFragment自身已經(jīng)生成一個(gè)全屏的ListView布局。
###2功茴、創(chuàng)建一個(gè)Crime實(shí)例類礁凡,可以用于在list中顯示出來(lái)
```public class Crime {
private String mTitle;
public String getTitle() {
return mTitle;
}
public String toString() {
return mTitle;
}
public void setTitle(String title) {
mTitle = title;
}
}```
###3高氮、再新建一個(gè)CrimeLab類慧妄,這個(gè)類用來(lái)生成ArrayList<Crime>,即把Crime類中的對(duì)象存儲(chǔ)到這個(gè)List集合中
```public class CrimeLab {
private ArrayList<Crime> mCrimes;//用來(lái)保存Crime對(duì)象的ArrayList
private static CrimeLab sCrimeLab;
private Context mAppContext;
//構(gòu)造方法
private CrimeLab(Context appContext) {
mAppContext = appContext;
mCrimes = new ArrayList<Crime>();//用來(lái)保存Crime對(duì)象的ArrayList
//創(chuàng)建100個(gè)Crime對(duì)象并儲(chǔ)存進(jìn)List中
for (int i = 0; i < 100; i++) {
Crime c = new Crime();
c.setTitle("Crime #" + i);
mCrimes.add(c);//ArrayList中的自帶方法剪芍,添加對(duì)象進(jìn)入list中
}
}
//單例模式中獲取單例的構(gòu)造方法
public static CrimeLab get(Context c) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(c.getApplicationContext());//變量前的s前綴塞淹,是android開(kāi)發(fā)的命名約定,表示該變量是一個(gè)靜態(tài)變量
}
return sCrimeLab;
}
//調(diào)用該方法返回ArrayList數(shù)組
public ArrayList<Crime> getCrimes() {
return mCrimes;
}
}```
關(guān)于 CrimeLab get(Context c)構(gòu)造方法罪裹,這個(gè)是使用了單例模式中的懶漢模式:JAVA特許的單例類饱普,該類僅允許創(chuàng)建一個(gè)實(shí)例。應(yīng)用在內(nèi)存存在多久状共,單例就能存在多久套耕,因此把對(duì)象列表存放在單例中可以保該對(duì)向的數(shù)據(jù)一直存在。單例常用于工具類峡继,比如我有一個(gè)工具箱窗體 每點(diǎn)擊一次按鈕 都會(huì)實(shí)例化一個(gè)工具箱箍铲,用戶點(diǎn)擊多次,就會(huì)彈出多次工具箱窗口鬓椭,所以在這里,我們就需要工具箱這個(gè)類只有一個(gè)實(shí)例关划,就要用到我們的單例模式了小染。要?jiǎng)?chuàng)建單例,需要?jiǎng)?chuàng)建一個(gè)帶有私有構(gòu)造方法及get()方法的類贮折,其中g(shù)et()返回實(shí)例裤翩。
###4、在CrimeListFragment中創(chuàng)建一個(gè)內(nèi)部類CrimeAdapter,讓這個(gè)類繼承于ArrayAdapter调榄,這樣方便我們進(jìn)行列表的定制
`public class CrimeListFragment extends ListFragment {
private ArrayList<Crime> mCrimes;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private class CrimeAdapter extends ArrayAdapter<Crime> {
public CrimeAdapter(ArrayList<Crime> crimes) {
super(getActivity(), android.R.layout.simple_list_item_1, crimes);
}
}```
###5踊赠、之后重寫CrimeAdapter中的getView()方法,用來(lái)對(duì)list列表的定制
```private class CrimeAdapter extends ArrayAdapter<Crime> {
public CrimeAdapter(ArrayList<Crime> crimes) {
super(getActivity(), android.R.layout.simple_list_item_1, crimes);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
convertView = getActivity().getLayoutInflater()
.inflate(R.layout.list_item_crime, null);
}
Crime c = getItem(position);
TextView titleTextView =
(TextView)convertView.findViewById(R.id.crime_list_item_titleTextView);
titleTextView.setText(c.getTitle());
return convertView;
}
}```
在這里我們使用convertView來(lái)加載我們自定義的List布局**R.layout.list_item_crime**每庆,用convertView的一個(gè)好處是可以循環(huán)利用View筐带,對(duì)list的加載有明顯的優(yōu)化作用。
同時(shí)我們需要再新建**R.layout.list_item_crime**布局文件
`<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/crime_list_item_titleTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:text="Crime title" />
<TextView android:id="@+id/crime_list_item_dateTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/crime_list_item_titleTextView"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingTop="4dp"
android:text="Crime date" />
</RelativeLayout>`
在這個(gè)布局文件里我們加載兩個(gè)textview控件缤灵,用來(lái)顯示標(biāo)題伦籍。完成后便在onCreate中new出adapter適配器的實(shí)例,并和list綁定
`private static final String TAG = "CrimeListFragment";
private ArrayList<Crime> mCrimes;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCrimes = CrimeLab.get(getActivity()).getCrimes();//創(chuàng)建出Crime對(duì)象的實(shí)例數(shù)組
CrimeAdapter adapter = new CrimeAdapter(mCrimes);//new出適配器的實(shí)例
setListAdapter(adapter);//和List綁定
}`
一切都完成后我們可以來(lái)運(yùn)行一下

可以看到listView已經(jīng)能顯示出來(lái)了腮出。接下來(lái)我們來(lái)實(shí)現(xiàn)list每個(gè)項(xiàng)目的點(diǎn)擊事件
###6帖鸦、覆蓋public void onListItemClick(ListView l,view v,int position, long id)
ListFragment中提供了一個(gè)便利的方法public void onListItemClick(ListView l,view v,int position, long id),只要覆蓋這個(gè)方法就可以實(shí)現(xiàn)點(diǎn)擊事件
`@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Crime c = (Crime)(getListAdapter()).getItem(position);
//填入想要實(shí)現(xiàn)的邏輯
}`
其中g(shù)etListAdapter是LFment的便利方法胚嘲,可以直接返回視圖上的adapter作儿,在調(diào)用getItem,獲取當(dāng)前點(diǎn)擊的Item的位置,并把他實(shí)例成需要的對(duì)象馋劈。
這樣我們就實(shí)現(xiàn)了listfragment來(lái)顯示列表攻锰!
最后源碼的下載:http://download.csdn.net/detail/owensteven/9587945