編輯:關於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
所以覆蓋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
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#
Android UI實現多行文本折疊展開效果
上文介紹了單行文本水平觸摸滑動效果,通過EditText實現TextView單行長文本水平滑動效果。本文繼續介紹了多行文本折疊展開,自定義布局View實現多行文本折疊和展
基於Android4.0ListView從網絡獲取圖片文字資源顯示
平時的一些Android學習視頻中,他們都是基於Android2.2的去使用ListView,我看到都是會在UI線程中去訪問網絡獲取數據,但是這在Android4.0之後
Android加載網絡GIF完整解決方案
前言:加載並顯示gif是App常見的一個功能,像加載普通圖片一樣,大體應該包含以下幾項功能:1、自動下載GIF到本地文件作為緩存,第二次加載同一個url的圖片不需要下載第
Android短信發送器實現方法
本文實例講述了Android短信發送器實現方法。分享給大家供大家參考。具體如下:這裡模擬android短信發送器的實現AndroidManifest.xml清單文件:&l