Android系列之Fragment(四)----ListFragment的使用-程序员宅基地

技术标签: java  移动开发  

【正文】

一、ListFragement的介绍:

ListFragment继承于Fragment。因此它具有Fragment的特性,能够作为activity中的一部分,目的也是为了使页面设计更加灵活。相比Fragment,ListFragment的内容是以列表(list)的形式显示的。

1、ListFragment布局:

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

下面是官方文档中ListFragment对应的一个layout示例:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingLeft="8dp"
     android:paddingRight="8dp">

    <ListView android:id="@id/android:list"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#00FF00"
           android:layout_weight="1"
           android:drawSelectorOnTop="false"/>

    <TextView android:id="@id/android:empty"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#FF0000"
           android:text="No data"/>
</LinearLayout>
复制代码

ListView中每一行的显示内容,是通过设置适配器ListAdapter来实现的。我们既可以自定义,也可以采用系统默认的layout。后面的应用实例中,会分别列举2种情况下的显示

2、绑定数据:

ListFragment绑定ListView的数据(即绑定适配器)时,必须通过ListFragment.setListAdapter()接口来绑定数据,而不是使用ListView.setAdapter() 或其它方法

 

二、通过ArrayAdapter来加载ListFragment的举例:

【举例】现在将平板电脑分成三部分:点击左侧的按钮,出现中间的新闻标题列表(ListFragment),点击中间ListFragment的某个item,在最右侧的fragment中显示详情。

新建工程文件m01_ListFragment01:

(1)定义activity_main.xml的布局

activity_main.xml的代码如下:

复制代码
<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"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/left"        
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#cccccc"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:text="show ListFragment" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/center"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:background="#AFEEEE"
        android:orientation="vertical" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/center"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:background="#00FFFF"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>
复制代码

实际上分配了三个线性布局,左侧显示按钮,中间显示标题,右侧显示详情。这个布局文件对应的可视化界面如下:

(2)定义中间的ListFragment,即新建文件ArticleListFragment.java:

ArticleListFragment.java的代码如下:

复制代码
 1 package com.example.m01_listfragment01;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import android.app.ListFragment;
 7 import android.os.Bundle;
 8 import android.view.LayoutInflater;
 9 import android.view.View;
10 import android.view.ViewGroup;
11 import android.widget.ArrayAdapter;
12 
13 public class ArticleListFragment extends ListFragment {
14 
15     private ArrayAdapter<String> adapter;
16 
17     @Override
18     public void onCreate(Bundle savedInstanceState) {
19         // TODO Auto-generated method stub
20         super.onCreate(savedInstanceState);
21         
22         //定义一个数组
23         List<String> data = new ArrayList<String>();
24         for (int i = 0; i < 30; i++) {
25             data.add("smyh" + i);
26         }
27         //将数组加到ArrayAdapter当中
28         adapter = new ArrayAdapter<String>(getActivity(),
29                 android.R.layout.simple_list_item_1, data);
30         //绑定适配器时,必须通过ListFragment.setListAdapter()接口,而不是ListView.setAdapter()或其它方法
31         setListAdapter(adapter);
32     }
33 
34     @Override
35     public View onCreateView(LayoutInflater inflater, ViewGroup container,
36             Bundle savedInstanceState) {
37         // TODO Auto-generated method stub
38         return super.onCreateView(inflater, container, savedInstanceState);
39     }
40 
41     @Override
42     public void onPause() {
43         // TODO Auto-generated method stub
44         super.onPause();
45     }
46 }
复制代码

核心代码是22至32行:我们让这个Fragment继承ListFragment,然后在onCreate()方法中定义一个ArrayAdapter,将数据放进去,最后绑定适配器就行了。需要注意的是,由于我们继承的是ListFragment,这个Fragment默认自带了一个布局,所以我们不需要重新新建布局文件了

(3)将中间的ListFragment加载到Activity当中去。当我们点击按钮时,就开始加载这个Fragment:

MainActivity.java的代码如下:

复制代码
 1 package com.example.m01_listfragment01;
 2 
 3 import android.app.Activity;
 4 import android.app.FragmentManager;
 5 import android.app.FragmentTransaction;
 6 import android.os.Bundle;
 7 import android.view.Menu;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 
12 public class MainActivity extends Activity {
13 
14     private FragmentManager manager;
15     private FragmentTransaction transaction;
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         Button button = (Button) findViewById(R.id.button1);
21         button.setOnClickListener(new OnClickListener() {
22             
23             //点击按钮,加载ListFragment
24             @Override
25             public void onClick(View v) {
26                 // TODO Auto-generated method stub
27                 manager = getFragmentManager();
28                 transaction = manager.beginTransaction();
29                 ArticleListFragment articleListFragment = new ArticleListFragment();
30                 transaction.add(R.id.center, articleListFragment, "article");
31                 transaction.commit();
32             }
33         });
34 
35     }
36 
37     @Override
38     public boolean onCreateOptionsMenu(Menu menu) {
39         // Inflate the menu; this adds items to the action bar if it is present.
40         getMenuInflater().inflate(R.menu.main, menu);
41         return true;
42     }
43 }
复制代码

这个代码比较简单,就不多解释了。

现在运行程序,初始界面如下:

点击左侧的按钮后,显示如下:

注:如果想实现:点击中间的某个item,弹出吐司显示那个item中的内容,可以在上方的ArticleListFragment.java中的监听事件里添加如下代码:

(代码放置的位置是:让它和Fragment的生命周期方法并列就行了)

复制代码
1     @Override
2     public void onListItemClick(ListView l, View v, int position, long id) {
3         // TODO Auto-generated method stub
4         super.onListItemClick(l, v, position, id);
5         String item = adapter.getItem(position);
6         Toast.makeText(getActivity(), item, 1).show();
7     } 
复制代码

由此我们可以看到,监听事件的函数为onListItemClick(),可以直接写,不需要set。

这里面关键代码在第05行,通过getItem()接收那个item,然后用字符串来接收。

我们先去掉这部分的监听事件代码,继续往下看。

(4)点击中间ListFragment的item,加载右边的DetailFragment:

我们在中间ListFragment中添加一个按钮的监听事件,监听事件的函数为onListItemClick(),ArticleListFragment.java在上面代码的基础之上,添加的代码如下:

(代码放置的位置是:让它和Fragment的生命周期方法并列就行了)

复制代码
 1     //点击按钮,加载最右侧的Fragment
 2     @Override
 3     public void onListItemClick(ListView l, View v, int position, long id) {
 4         // TODO Auto-generated method stub
 5         super.onListItemClick(l, v, position, id);
 6         
 7         //点击按钮后,加载右边的Fragment
 8         FragmentManager manager = getFragmentManager();
 9         FragmentTransaction transaction = manager.beginTransaction();
10         DetailFragment detailFragment = new DetailFragment();
11         //记住:这个地方必须用replace,而不是用add
12         transaction.replace(R.id.right, detailFragment, "detailFragment");
13         
14         //将中间的item的内容放到Bundle对象当中,然后放到最右侧Frament的参数当中
15         String item = adapter.getItem(position);
16         Bundle args = new Bundle();
17         args.putString("item",item);
18         detailFragment.setArguments(args);
19         //Toast.makeText(getActivity(), item, 1).show();        
20         
21         transaction.commit();
22     }
复制代码

上面的代码中,我们是在中间的Fragment中点击按钮,然后加载右边的Fragment,然后要注意14至18行的核心代码,看一下它是如何通过bundle来传递数据的

需要注意的是,第12行代码必须用replace的方式加载右侧的fragment,而不是add;如果用add,运行的错误稍后将展示出来。

(5)定义右边的DetailFragment:

先定义布局文件,在里面加一个TextView,fragment_detail.xml的代码如下:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
</LinearLayout>
复制代码

然后新建文件,DetailFragment.java的代码如下: 

复制代码
 1 package com.example.m01_listfragment01;
 2 
 3 import android.app.Fragment;
 4 import android.os.Bundle;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 import android.widget.TextView;
 9 
10 public class DetailFragment extends Fragment {
11 
12 
13     @Override
14     public void onCreate(Bundle savedInstanceState) {
15         // TODO Auto-generated method stub
16         super.onCreate(savedInstanceState);
17     }
18 
19     @Override
20     public View onCreateView(LayoutInflater inflater, ViewGroup container,
21             Bundle savedInstanceState) {
22         // TODO Auto-generated method stub
23         View view = inflater.inflate(R.layout.fragment_detail, null);
24         TextView textView = (TextView)view.findViewById(R.id.textView1);
25         textView.setText(""+getArguments().getString("item"));
26         return view;
27     }
28 
29     @Override
30     public void onPause() {
31         // TODO Auto-generated method stub
32         super.onPause();
33     }    
34 }
复制代码

核心代码是第25行,仔细看一下我们是怎么通过键值对来拿到中间的Fragment传递过来的item的内容

现在运行程序,一次点击左边的按钮和中间的item,效果如下:

如果我们在中间的Fragment中错误地通过add方式加载右边的Fragment,而不是通过replace方式,最终错误的效果如下:

也就是说,每点击一次中间的item,就会在右边继续加载一个文本,而不是替代的方式,很显然,这种方式不是我们想要的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34209406/article/details/90654564

智能推荐

mac终端运行mysql -uroot -p时出现-bash: mysql: command not found_在terminal内输入mysql -u root -p,提示“comman not found”.-程序员宅基地

文章浏览阅读7.5k次。原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然就找不到命令解决方法:我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件。1. 知道mysql命令或mysqladmin命令的完整路径,比如mysql的路径是:/usr/local/mysql/bin/mysql,2. 执行命令:$sudo ln -s /usr/lo_在terminal内输入mysql -u root -p,提示“comman not found”.

差分进化算法与多对象优化问题的研究进展-程序员宅基地

文章浏览阅读888次,点赞18次,收藏18次。1.背景介绍差分进化算法(Differential Evolution, DE)是一种基于变异和重组的全局搜索优化算法,它在过去几年中得到了广泛的关注和应用。在这篇文章中,我们将深入探讨差分进化算法与多对象优化问题的研究进展,包括背景介绍、核心概念与联系、算法原理和具体操作步骤、数学模型公式详细讲解、具体代码实例和解释、未来发展趋势与挑战以及常见问题与解答。1.1 背景介绍多对象优化问...

小程序毕设作品之微信预约订座小程序毕业设计(7)中期检查报告-程序员宅基地

文章浏览阅读456次。小程序毕设作品之微信预约订座小程序毕业设计(7)中期检查报告

C语言命令编程_c语言 运行 命令行-程序员宅基地

文章浏览阅读1.5k次,点赞5次,收藏11次。C语言命令编程按下Win+R,输入CMD,进入命令行模式Ipconfig是查看本机的ip.Ping www.qq.com是查看网络是否畅通这个时候是文件被占用,退出这个应用程序就可以CD是进入一个文件夹的路径,进入路径以后,就可以直接执行System在stdlib.h中system(“C:\CMD.exe”);参数只有一个,就是输入命令行并执行所有的C程序,只要是黑窗口,都可以在命令行下执行,C黑窗口程序可以调用其他任何C语言黑窗口程序在命令行执行,调_c语言 运行 命令行

MATLAB编写自己的BP神经网络程序_编写 1 套相关的神经网络应用系统程序matlab-程序员宅基地

文章浏览阅读1.5w次,点赞32次,收藏253次。目录前言一、什么是神经网络?二、手写代码1.主代码2.归一化函数2.反归一化函数二、工具箱代码总结前言因为项目需要,自己搞了一个BP神经网络的程序,顺便做一下笔记人工智能现在的分支有1机器学习:就是通过算法从大数据中学习到规律,而后对未知的结果进行预测。 1.21监督学习:输入和输出已知,训练集中的目标是人为注入的,常见的作用是分类数据。回归分析,统计分类。 1.22非监督学习:事先没有样本,直接对数据进行建模,非监督学习最点..._编写 1 套相关的神经网络应用系统程序matlab

安装ubuntu:-程序员宅基地

文章浏览阅读38次。ubuntu

随便推点

H5技术完美实现调用手机摄像头、相册。图片上传base64,图片压缩、预览、删除以及图片旋转90度的处理--demo。_h5实现调用手机摄像头相册。完美实现图片压缩、预览、删除的功能。---demo-程序员宅基地

文章浏览阅读1w次。看了帖子上有很多关于H5调用手机摄像头、相册的例子,也有很多可靠的栗子,综合技术点针对HTML5调用用手机相机、相册的的一次代码整合。实现提供完成的Demo提供给大家,可直接应用于项目中需要图片上传的功能。因为是H5直接调用,并没有用到像Cordova或者HTML5Plus的 JavaScript库去调用手机硬件,因此在低端手机可能会调用不到摄像图、或者相册,因此这也是在H5在这里的不足,不好解决。_h5实现调用手机摄像头相册。完美实现图片压缩、预览、删除的功能。---demo

VMware 6.0 vFlash Read Cache setup-程序员宅基地

文章浏览阅读449次。VMware vFlash Read Cache allowsto leverage host local SSDs enabling a caching layer for the VMs. No other software or extra VIBs need to be installed on the host since allneces..._vmware读取外设flash

Android笔记大全链接_安卓 笔记软件 超链接-程序员宅基地

文章浏览阅读1.7k次。android笔记链接_安卓 笔记软件 超链接

ubuntu 的硬盘安装安装_ubuntu自定义硬盘安装-程序员宅基地

文章浏览阅读487次。也许是自己太笨,搞了一天用u盘安装都是重启后没有启动项,在网上找了很多的解决方法都无效,我认为肯定是启动项被写进了u盘里,所以重启才没有启动项,最终决定放弃,改用硬盘安装;将安装步骤记下来备忘 先准备两个东西EasyBCD软件和iso镜像1.安装EasyBCD_ubuntu自定义硬盘安装

java 切割字符串split用法_list.add(ss.substring(start,i));-程序员宅基地

文章浏览阅读6.4k次。java 切割字符串split用法_list.add(ss.substring(start,i));

UVa11520-程序员宅基地

文章浏览阅读498次。Problem: Fill the Square Description: 有一个矩阵,当中的元素是大写字母,但是有个前提,相邻的位置大写字母不能相同,现在这个矩阵中的某些位置已近有字母了,要你把这个矩阵填满,并且保证字典序最小。 Solution: 简单DFSDFS。但是要注意的是,如果我这种做法超时了,那就把空的位置存到一个数组中,这样dfsdfs时就可以减少栈的空间使用。 Code(JA_uva11520