Android App 组件之 ListFragment

1 ListFragement 介绍

ListFragment 继承于 Fragment。因此它具有 Fragment 的特性,能够作为 activity 中的一部分,目的也是为了使页面设计更加灵活。

相比 Fragment,ListFragment 的内容是以列表(list)的形式显示的。

1.1 ListFragment布局

ListFragment 的布局默认包含一个list view。因此,在ListFragment对应的布局文件中,必须指定一个 android:id 为 “@android:id/list” 的ListView控件! 若用户向修改list view的,可以在onCreateView(LayoutInflater, ViewGroup, Bundle)中进行修改。当然,用户也可以在ListFragment的布局中包含其它的控件。

下面是ListFragment对应的一个layout示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <!-- ListFragment对应的android:id值固定为"@id/android:list" -->
    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:drawSelectorOnTop="false"
        />
    
</LinearLayout>

ListView中每一行的显示内容,是通过设置适配器来实现的。我们既可以自定义,也可以采用系统默认的layout。后面的应用实例中,会分别列举2种情况下的显示。
 
1.2 绑定数据
ListFragment绑定ListView的数据,必须通过ListFragment.setListAdapter()接口来绑定数据,而不是使用ListView.setAdapter() 或其它方法!
2 ListFragment应用实例
应用实例说明:建立一个activity,包括2个ListFragment。第1个ListFragment采用中ListView每一行的内容通过android自带的android.R.layout.simple_list_item_1布局来显示;第2个ListFragment每一行的内容通过自定义的layout文件来显示,每一行显示两个文本。
activity对应的layout文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment 
        android:name="com.skywang.app.ListFragmentImpl"
        android:id="@+id/fragment1" 
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <fragment 
        android:name="com.skywang.app.ListFragmentSelf"
        android:id="@+id/fragment2" 
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
</LinearLayout>

说明:
(01) 该layout布局包含两个fragment。
 
activity的代码:
public class ListFragmentTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_fragment_test);        
    }
}

说明:
(01) 在 onCreateView()中,调用list_fragment_impl作为该ListFragment的布局文件。
(02) 在 onCreate()中,通过setListAdapter() 设置android.R.layout.simple_list_item_1为ListView每一行的布局文件,设置cities为其中数据的每一项内容。

ListFragmentImpl.java的代码:

public class ListFragmentImpl extends ListFragment {
    private static final String TAG = "ListFragmentImpl";

    private ListView selfList;

    String[] cities = { "Shenzhen", "Beijing", "Shanghai", "Guangzhou",
            "Wuhan", "Tianjing", "Changsha", "Xi'an", "Chongqing", "Guilin", };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        return inflater.inflate(R.layout.list_fragment_impl, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        // 设置ListFragment默认的ListView,即@id/android:list
        this.setListAdapter(new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, cities));

    }

    public void onListItemClick(ListView parent, View v, int position, long id) {
        Log.d(TAG, "onListItemClick");
        Toast.makeText(getActivity(), "You have selected " + cities[position],
                Toast.LENGTH_SHORT).show();
    }
}

list_fragment_impl.xml的内容:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <!-- ListFragment对应的android:id值固定为"@id/android:list" -->
    <ListView
        android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:drawSelectorOnTop="false"
        />
    
</LinearLayout>

ListFragmentSelf.java的代码:

public class ListFragmentSelf extends ListFragment {
    
    private static final String TAG = "ListFragmentImpl";

    private ListView selfList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        return inflater.inflate(R.layout.list_fragment_self, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        final String[] from = new String[] { "title", "info" };
        final int[] to = new int[] { R.id.text1, R.id.text2 };

        Log.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);
        // 建立SimpleAdapter,将from和to对应起来
        SimpleAdapter adapter = new SimpleAdapter(this.getActivity(),
                getSimpleData(), R.layout.two_textview, from, to);
        this.setListAdapter(adapter);
    }

    public void onListItemClick(ListView parent, View v, int position, long id) {
        Log.d(TAG, "onListItemClick");
        Toast.makeText(getActivity(), "You have selected " + position,
                Toast.LENGTH_SHORT).show();
    }

    private List<Map<String, Object>> getSimpleData() {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("title", "Ferris wheel");
        map.put("info", "Suzhou Ferris wheel");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "Flower");
        map.put("info", "Roser");
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "Disk");
        map.put("info", "Song Disk");
        list.add(map);

        return list;
    }
}

说明:
(01) 在 onCreateView()中,调用list_fragment_self作为该ListFragment的布局文件。
(02) 在 onCreate()中,通过setListAdapter() 设置R.layout.two_textview为ListView每一行的布局文件。

猜你喜欢

转载自www.cnblogs.com/zx-blog/p/11836386.html
今日推荐