Android之listfragment的使用例子
1、fragment简介
我对fragment的理解是基于activity的,对于大多数的基本开始发时,我们最先遇到的就是用activity来开发。
简单的例子,新建一个最基本的android空白界面,我们得到的是一个可以显示一个空白界面的app。一个activity对应着一个layout。
但是fragment则是基于activity,突破了已经固定好的layout的限制,在原有的layout中,把布局元素作为容器,动态容纳新的layout。
这样就等于在一个activity中可以拥有多个界面。
2、listfragment实例讲解
最终效果
最终效果如上图所示
2.1、首先我们先谈一下,准备工作activity_main的布局:activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include android:id="@+id/layout_bar" layout="@layout/layout_title"/> <framelayout android:id="@+id/fragment_container" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" > </framelayout> <include layout="@layout/layout_bottom"/> </linearlayout>
这里的线性布局,包含了三个部分(1)layout_title(2)fragment_container(3)layout_bottom
其中(2)fragment_container就是用来动态加载listfragment的地方。
2.2、第二点我们看一下被动态加载到fragment_container中的布局:文件fragment_order.xml
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <listview android:id="@+id/android:list" android:scrollbars="none" android:dividerheight="0dp" android:divider="#00000000" android:listselector="#00000000" android:layout_width="match_parent" android:layout_height="match_parent" /> </relativelayout>
分析以上的xml可以看出,为了动态加载一个listfragment,我们为其编写了一个拥有listview组件的xml,这一点是必须的。
2.3、第三点,我们看一看到底是如何在activity中用什么方式动态的加载listfragment
我们看一下mainactivity.java的关键部分
private fragmentmanager manager; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //********************************************* manager = getfragmentmanager(); manager.begintransaction().add(r.id.fragment_container, homefragment, "article").commit(); //*********************************************
我特殊标记的地方就是用来动态加载的代码。
为了加载fragment,我们要编写一个fragment类,这个类的对象我们可以看到在add函数中被用到,也是在这个地方,将fragmen加载。
使用fragmentmanager的add函数来加载,它有三个参数(1)fragment被加载的位置(r.id.fragment_container)(2)一个fragment对象,这个对象的编写也很重要,等会讲到。(3)为动态加载的fragment起一个名字,这一项,随便起。
2.4、第四步,fragment对象的类的编写
上文中第二步的fragment_order.xml就是被这个类来使用,实例化,正是因为有了这个类才能够将fragment实例化,于是才能被动态加载。
public class fragment_order extends listfragment { private mainactivity parentactivity; private string[] values = new string[] { "快餐店", "烤食店", "烧鱼店", "甜食店", "蔬菜店", "融合菜店","面条店" }; private int[] images = new int[] { r.drawable.fastfood, r.drawable.roastfood, r.drawable.fishfood, r.drawable.sweetfood, r.drawable.vegetables, r.drawable.multifood,r.drawable.noodles }; //用来初始化listfragmnet每一条项目的资源 @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { return inflater.inflate(r.layout.fragment_order, container, false); //这里用inflate函数,在初始化创建view时返回fragment_order.xml实例 } //下面的部分则是用于将每一条项目的资源放入到listview的每一个条目中去 @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); list<map<string, object>> list = new arraylist<map<string, object>>(); for (int i = 0; i < values.length; i++) { map<string, object> listitem = new hashmap<string, object>(); listitem.put("values", values[i]); listitem.put("images", images[i]); list.add(listitem); } simpleadapter adapter = new simpleadapter(getactivity(),list, r.layout.list_item, new string[] { "values", "images" }, new int[] { r.id.storename, r.id.storepic }); setlistadapter(adapter); }
主要想讲一讲simpleadapter的用法,因为这很重要,如果数据不能和layout绑定,那么就会不能运行成功。
使用simpleadapter是很重要的。为什么要使用simpleadapter的原因很简单,绑定数据和layout的工作不可能完全由程序自动完成,数据和layout的对应关系需要自己来定,adapter就是为了把对应的数据绑到对应的layout上
simpleadapter算是adapter中比较简单好用的一个
listitem中用了map<string,object>的数据格式,代表了每一行内容其中的数据。
list则是一连串的map<string,object>
我们看simpleadapter的参数,总共5个:(1)得到当前的activity(2)已经将数据存好了的list(3)又是一个xml,这个xml是用来作为listview的一条项目的layout,这样一个项目的外观才会被确定(4)这个数组指明了在map<string,object>中,数据的名称代号是什么,这样adapter在取list的每个条目的数据时,才有参照。这个参数同时和下一个参数有很大关系(5)这个参数是layout中的id,和上一个参数对应着。由上一个参数的数据的名称作为指导,将每一行的数据可以对应到相应的id。
2.5、最后把listview的每一行条目的layout代码写一下:list_item.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" xmlns:app="http://schemas.android.com/apk/res-auto"> <linearlayout android:id="@+id/contactitem_layout" style="@style/mmlistitem" android:layout_height="65.0dip" android:paddingleft="12dip" android:background="@drawable/border" android:padding="2dp" android:weightsum="1"> <relativelayout android:id="@+id/avatar_container" android:layout_width="match_parent" android:layout_margintop="4dp" android:layout_height="wrap_content" android:layout_alignparentleft="true" > <imageview android:id="@+id/storepic" android:layout_width="50.0dip" android:layout_height="50.0dip" android:src="@drawable/head" /> <textview android:id="@+id/storename" style="@style/mmfonttitleinlist" android:layout_torightof="@+id/storepic" android:layout_width="match_parent" android:layout_height="match_parent" android:text="no data" /> </relativelayout> </linearlayout> </linearlayout>
最后祝大家新年快乐,鸡年大吉吧!!!
推荐阅读
-
Android之listfragment的使用例子
-
Android使用广播(BroadCast)实现强制下线的方法
-
Android之Gallery使用例子
-
Android编程开发之ScrollView嵌套GridView的方法
-
iOS开发之Quartz2D的介绍与使用详解
-
Android Studio中ButterKnife插件的安装与使用详解
-
iOS之单独使用UISearchBar创建搜索框的示例
-
Android编程实现两个Activity相互切换而不使用onCreate()的方法
-
Android之沉浸式状态栏的实现方法、状态栏透明
-
Android使用selector修改TextView中字体颜色和背景色的方法