Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android ListFragment

Android ListFragment

編輯:關於Android編程


Android是在Android 3.0(API level 11)開始引入Fragment的(為了兼容較低版本的設備使用支持庫類)。可以把Fragment看成Activity中的模塊,這個模塊有自己的布局,有自己的生命周期(由托管activity調用其周期方法),單獨處理自己的輸入,在Activity運行的時候可以加載或者移除Fragment模塊。


ListFragment是Fragment的子類,內置列表顯示支持功能。ListFragment通過內置的ListView顯示綁定在其上面的數據。下面就通過例子了解具體的用法:


1、模型層 Day類和DayLab類

通過DayLab對象的getDays()方法獲取用來綁定的數據。

Day.java

package com.example.showdays;
import java.util.ArrayList;

public class Day {
	private String mTitle;

	public String getTitle() {
		return mTitle;
	}

	public void setTitle(String mTitle) {
		this.mTitle = mTitle;
	}
}

DayLab.java

package com.example.showdays;
import java.util.ArrayList;

public class DayLab {
	private ArrayList mDays;

	public DayLab() {
		mDays = new ArrayList();
		for (int i = 1; i <= 10; i++) {
			Day day = new Day();
			day.setTitle("Title #" + i);
			mDays.add(day);
		}
	}

	public ArrayList getDays() {
		return mDays;
	}
}

2、創建DayListFragment類

繼承ListFragment類。並給其內置的ListView設置Adapter

DayListFragment.java

package com.example.showdays;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;

public class DayListFragment extends ListFragment {
	private ArrayList days;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		DayLab dayLab = new DayLab();
		this.days = dayLab.getDays();
		ArrayAdapter adapter = new ArrayAdapter(getActivity(),
				android.R.layout.simple_list_item_1, days);
		// 第一個參數: Context對象,使用第二個參數的資源ID需要該Context對象
		// 第二個參數: 資源ID,可定位ArrayAdapter用來創建View對象的布局,這裡的實參是 Android SDK提供的預定義布局資源
		// 第三個參數: 數據集
		setListAdapter(adapter);// 給DayListFragment內置的ListView設置adapter
	}
}

3、創建DayActivity類

繼承FragmentActivity類。托管DayListFragment對象

其布局如下:

activity_day.xml

<frameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</frameLayout>
在類中引用此布局文件,並將DayListFragment對象放置在id為fragmentContainer的FrameLayout容器視圖中。

DayActivity.java

package com.example.showdays;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class DayActivity extends FragmentActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_day);

		FragmentManager fm = getSupportFragmentManager();
		// 繼承支持庫類FragmentActivity獲取FragmentManager對象的方法
		// 若繼承Activity使用getFragmentManager()
		Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
		if (fragment == null) { // 查看fragment事務隊列中是否存在此事物
			fragment = new DayListFragment();
			fm.beginTransaction().add(R.id.fragmentContainer, fragment)
					.commit();
			// 提交事務(資源ID作為唯一標識符且通知視圖位置)
		}
	}

}


至此程序就可以正常運行了,運行效果如下圖:

\

可以看到,已經呈現出列表形式,但是要顯示的內容卻不是我想要的。

那是因為 Android SDK提供的預定義布局資源(android.R.layout.simple_list_item_1)布局如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">

這樣在ListView被實例化後與adapter會話時,ArrayAdapter.getView()方法會調用Day對象的toString()方法,然後將返回值傳遞給TextView。

所以覆蓋Day對象toString()方法:

Day.java

package com.example.showdays;
import java.util.ArrayList;

public class Day {
	private String mTitle;

	public String getTitle() {
		return mTitle;
	}
	public void setTitle(String mTitle) {
		this.mTitle = mTitle;
	}

	@Override
	public String toString() {
		return mTitle;
	}
}
此時再運行程序,運行效果如下圖:
\


4、自定義列表項

上面使用的是Android SDK提供的預定義布局資源,直接把數據放置在TextView組件中來顯示。

下面我就自定義一個列表項布局,將要顯示的信息用Button組件來顯示,布局如下:

my_list_item.xml

因為ListView更新視圖的時候都要調用ArrayAdapter.getView()方法來獲取View。所以要想把自己定義的列表項加入到ListView中,可以重寫getView()方法,覆蓋它並返回一個自己定義的View。做出改變如下:

DayListFragment.java

package com.example.showdays;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;

public class DayListFragment extends ListFragment {
	private ArrayList days;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		DayLab dayLab = new DayLab();
		this.days = dayLab.getDays();
		DayAdapter adapter = new DayAdapter(days);
		setListAdapter(adapter);
	}

	private class DayAdapter extends ArrayAdapter {
		public DayAdapter(ArrayList days) {
			super(getActivity(), 0, days);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) { // 此列表項是否存在,不存在則創建一個
				convertView = getActivity().getLayoutInflater().inflate(
						R.layout.my_list_item, null);
			}
			Day day = getItem(position); // 獲取當前位置的Day對象
			Button button = (Button) convertView.findViewById(R.id.button);
			button.setText(day.toString());
			return convertView;
		}
	}
}
最後運行一下,運行效果如下圖:



#DONE#





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved