CriminalIntent项目开发笔记(三)----ListFragment的使用

本节主要学习ListFragment的用法。

1.更新模型层,创建一个 CrimeLab 类用于存储多个Crime对象

  CrimeLab采用单例模式,以便数据的集中存储

package com.criminalintent;

import android.content.Context;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class CrimeLab {
    private List<Crime> crimeList;
    private Context context;

    private CrimeLab(Context context){
        this.context=context;
        crimeList=new ArrayList<Crime>();
        for(int i=0;i<100;i++){
            Crime crime=new Crime();
            crime.setTitle("item"+i);
            crime.setSolved(i%2==0);
            crimeList.add(crime);
        }
    }
    private static CrimeLab instance;
    public static CrimeLab getInstance(Context context){
        if(instance==null)
            instance=new CrimeLab(context.getApplicationContext());
        return instance;
    }
    public List<Crime> getCrimeList(){
        return crimeList;
    }
    public Crime getCrime(UUID uuid){
        for(Crime c:crimeList){
            if(c.getUuid()==uuid)
                return c;
        }
        return null;
    }
}

2.创建 CrimeListFragment类以及CrimeAdapter内部类

  该类继承于ListFragment类,也就是本节主要的学习内容,ListFragment中默认有一个ListView对象,所以我们不用再新创建一个ListView控件的视图,只需要实现Adapter控制器对象,然后调用setListAdapter(adapter)方法即可。

在此之前,我们先准备好Adapter需要的子布局视图 list_item_crime.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <CheckBox android:id="@+id/crime_list_item_solvedCheckBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_alignParentRight="true"
        android:enabled="false"
        android:focusable="false"
        android:padding="4dp" />
    <TextView android:id="@+id/crime_list_item_titleTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/crime_list_item_solvedCheckBox"
        android:textStyle="bold"
        android:paddingLeft="4dp"
        android:paddingRight="4dp"
        android:text="Crime title" />
    <TextView android:id="@+id/crime_list_item_dateTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/crime_list_item_titleTextView"
        android:layout_toLeftOf="@id/crime_list_item_solvedCheckBox"
        android:paddingLeft="4dp"
        android:paddingRight="4dp"
        android:paddingTop="4dp"
        android:text="Crime date" />
</RelativeLayout>

接下来创建CrimeListFragme

public class CrimeListFragment extends ListFragment {
    private List<Crime> crimeList;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        crimeList=CrimeLab.getInstance(getActivity()).getCrimeList();
        getActivity().setTitle(R.string.crimes_title);
//       构造adpter
        CrimeAdapter adapter=new CrimeAdapter(getActivity(),R.layout.list_item_crime,crimeList);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Crime crime= (Crime) getListAdapter().getItem(position);
        Log.d("item",crime.getTitle() + " was clicked");
    }
//    CrimeAdapter控制ListView控件中的每个子布局如何显示,所以构造 CrimeAdapter需要一个子项布局视图,和数据链表
 //   在此为 R.layout.list_item_crime和crimeList
    class CrimeAdapter extends ArrayAdapter<Crime>{

        public CrimeAdapter(Context context, int resource, List<Crime> objects) {
            super(context, resource, objects);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            Crime crime=getItem(position);
            if(convertView==null){
                convertView=LayoutInflater.from(getContext()).inflate(R.layout.list_item_crime,null);
            }
            TextView titleTextView= (TextView) convertView.findViewById(R.id.crime_list_item_titleTextView);
            titleTextView.setText(crime.getTitle());
            TextView dateTextView= (TextView) convertView.findViewById(R.id.crime_list_item_dateTextView);
            dateTextView.setText(crime.getDate().toString());
            CheckBox checkBox= (CheckBox) convertView.findViewById(R.id.crime_list_item_solvedCheckBox);
            checkBox.setChecked(crime.isSolved());
            return convertView;
        }
    }
}

  

3.抽象Activity类

  在Activity的代码中,除了创建fragment的代码不同,其他都一样,所以可以将相同的代码抽出来,形成一个抽象父类。创建fragment的代码,写成一个抽象方法createFragment(),以后每创建一个Activity都只需重写creatFragment()方法即可。下面就是抽象出来的类

public abstract class SingleFragmentActivity extends FragmentActivity {
    protected abstract Fragment createFragment();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fm=getSupportFragmentManager();
        Fragment fragment=fm.findFragmentById(R.id.fragmentContainer);
        if(fragment==null){
            fragment=createFragment();
            fm.beginTransaction()
                    .add(R.id.fragmentContainer,fragment)
                    .commit();
        }
    }
}

4.修改MainActivity类,让其继承SingleFragmentActivtity,并重写createFragment方法  

public class MainActivity extends SingleFragmentActivity {

    @Override
    protected Fragment createFragment() {
        return new CrimeListFragment();
    }

}

最后运行效果如下:

时间: 2024-10-16 12:08:20

CriminalIntent项目开发笔记(三)----ListFragment的使用的相关文章

[Openwrt 项目开发笔记]:USB挂载&amp; U盘启动(三)

在上一篇中,我结合Netgear Wndr3700讲解了如何对Openwrt进行必要的配置.接下来,我们就想要在Openwrt上安装必要的软件了.可是这时候新的问题又来了:当安装一些软件之后,存储空间不足了.这时候该怎么办呢?以4M的Flash为例,当大家讲Openwrt固件刷到自己的路由器后,大家会发现剩余的空间往往只剩下不到2M.当我们需要安装许多Openwrt本身不带的软件时,就会发现如此小的空间实在是太寒酸了.那么,该如何解决这样的问题呢? 一. 添加USB扩展(注:本文默认大家的路由器

[Openwrt 项目开发笔记]:DDNS设置(五)

在上一节中,我主要讲述了如何在Openwrt上安装Samba服务器以及Ftp服务器.在本节中,我将介绍一下,一个比较使用的功能:DDNS.为远程物联网控制打下基础. 题外话:DDNS设置原本是极为简单的.可是由于我的路由所在现实环境的原因,以及我个人能力有限,一直无法达到我预期的目的,真是有点累觉不爱了. ok,言归正传,开始抛干货! 一.安装DDNS服务 opkg update opkg install ddns-scripts luci-app-ddns 二.注册一个动态域名 关于动态域名服

[openwrt 项目开发笔记]: 传送门

“Openwrt 项目开发笔记”系列传送门: [Openwrt 项目开发笔记]:Openwrt平台搭建(一) (2014-07-11 00:11) [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗 (2014-07-11 20:32) [Openwrt 项目开发笔记]:Openwrt必要设置(二) (2014-07-13 15:03) [Openwrt 项目开发笔记]:USB挂载& U盘启动(三) (2014-07-13 23:42) [Openwrt 项目开发笔记]:Samb

[Openwrt 项目开发笔记]:PHP+Nginx安装(七)

在上一节中,我们已经搭建了MySQL数据库了,因此在这一节中,我主要讲解php的安装,以及php的运行环境Nginx的安装.参考(http://www.right.com.cn/forum/thread-89216-1-1.html) 一.PHP安装 1.安装php软件包. opkg updateopkg install php5 php5-mod-apc opkg install php5-mod-gd php5-mod-session opkg install php5-mod-pdo-my

[Openwrt 项目开发笔记]:Samba服务&amp;vsFTP服务(四)

在上一节中,我们讲述了如何在路由器上挂载U盘,以及如何通过改造U盘提升路由器的存储和数据处理能力.通过增加USB挂载,为我们后续进行智能家居构建提供了保障. 在本节中,我将简单介绍如何在路由器上建立网络文件共享服务. 一.为何要建立文件共享服务: 在智能家居网络中,一个很重要的需求就是安全.当一个智能家居方案部署之后,用户往往最先考虑的也是安全问题.那么怎样进行安全管理呢?一种常用的解决方法是实时的监控传感器以及家电的状态,一旦发生异常,通过邮件.短信甚至打电话的方式通知用户.当用户接收到异常之

[Openwrt 项目开发笔记]:MySQL配置(六)

在本人的项目中,运行在路由器上的服务器采用Nginx+MySQL+PHP 架构.通常较为常见的web框架为Lamp(Linux+Apache+Mysql+PHP),为何我们选择LNMP呢?我将在后续的几篇文章中给出答案. 首先我们来介绍如何在Openwrt上搭建MySQL数据库. 参考文章:(http://blog.csdn.net/yufei_email/article/details/21845935) 一.安装MySQL数据库(在backfire10.3版本中,package已经包含mys

【转】【系列】Openwrt 项目开发笔记

这个系列来自隔壁的坛友@Double_win,已自觉主动聚合,看起来很方便. “Openwrt 项目开发笔记”系列传送门: [Openwrt 项目开发笔记]:Openwrt平台搭建(一) (2014-07-11 00:11) [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗 (2014-07-11 20:32) [Openwrt 项目开发笔记]:Openwrt必要设置(二) (2014-07-13 15:03) [Openwrt 项目开发笔记]:USB挂载& U盘启动(三) (

[Openwrt 项目开发笔记]:Openwrt平台搭建(一)

最近开始着手进行Openwrt平台的物联网网关设计,思路有些乱,通过笔记的方式进行记录和整理. 声明: 在本文中,有些内容摘自网上,我进行了整合,因此出处不明,在此对原文作者致歉! -----------------------------------------------------(分割线)------------------------------------------------------- 一. 选择Openwrt平台的理由 传统的路由器固件是由官方提供的.这些固件是不开源的,而

[Openwrt 项目开发笔记]:Openwrt必要设置(二)

前面的两篇blog中,我将如何搭建Openwrt的开发.编译.调试以及烧写环境的方法一一列出了.从本文开始, 我将介绍如何一步一步进行Openwrt设置,以满足路由器作为智能家居网关的功能. ok,闲话休提,开始上干货. 一.Openwrt初始配置 1. 密码设置 当我们成功地将Openwrt刷入路由器后,路由器会经过大约4~5分钟的时间重启(以Netgear Wndr3700为例).待路由器启动之后,用一根网线与路由器LAN口直连,并将PC的IP设置到192.168.1.*网段. 提示:不同的