CriminalIntent开发(二)

这个应用是在容器视图中显示列表。我们要创建一个ListFragment和一个Activity,还有与ListFragment相匹配的layout。

Fragment

创建CrimeListFragment类扩展自ListFragment。HoneyComb系统版本引入了ListFragment类,相应的,支持库也引入了该类。

import android.support.v4.app.ListFragment;

ListFragment是通过ListView将列表项展示给用户。而ListView通过adapter来申请视图对象。

Adapter负责:

                          创建必要的视图对象;

                          用模型层数据填充视图对象;

                          将准备好的视图对象返回给ListView。

随意例子中采用了setListAdapter(ListAdapter)来为CrimeListFragment管理内置ListView设置adapter。(详情参看后面的代码链接,现在就可以打开它对比观看)

FragmentActivity

由于每一个ActivityFragment都有相似的代码,于是作者创建了一个SingleFragmentActivity抽象类用来减少以后的代码输入。在书中的例子都是在一个FragmentContainer动态添加一个Fragment,所以唯一不同的代码就是在事物添加Fragment之前动态创建的代码。

修改CrimeActivity扩展自SingleFragmentActivity。

创建CrimeListActivity扩展自SingleFramentActivity。

部分:

Crime                          列表子元素的对象

CrimeLab                可以创建和获取一个Crime 列表。

Activity

CrimeListActivity            扩展自SingleFragmentActivity 创建CrimeListFragment 事物

SingleFragmentActivity

Fragment

CrimeListFragment            根据list_item_crime.xml 生成相应的View

Res/layout

Activity_fragment.xml        定义了容易视图

List_item_crime.xml        定义了列表子元素的视图

应用功能介绍:CriminalIntent这个应用可以详细的记录各种陋习,其中包括了标题、日期和照片,支持在联系人中查找当事人

UI fragment与fragment管理器

模型层

CriminalIntent开发(二)_第1张图片

crime类以及生成的getter与setter方法

托管UI fragmen

CriminalIntent开发(二)_第2张图片
CriminalIntent开发(二)_第3张图片

CriminalActivity类的fragment托管布局

CrimeFragment布局以及类的创建

CriminalIntent开发(二)_第4张图片

RecyclerView显示列表

应用模型层将新增一个CrimeLab对象,而且显示列表需要在应用控制器层新增一个activity和一个fragment

CriminalIntent开发(二)_第5张图片

有了RecycleView的创建避免了很多繁琐的创建,创建的时候刚好创建12个,用户下滑的时候上一个视图会回收利用,它的作用就是回收再利用,循环往复

CrimeFragment需要的id存储在CrimeActivity 的intent里,他总是需要由某个具体的Activity托管着,CrimeFragment就不能用于别的Activity。而通过argument 的方式,就可以解决上述问题。fragment实例可附带一个Bundle对象,可以bundle对象存储信息,然后调用Fragment.setArguments(Bundle),argument附加给fragment。通过getArgument()方法可获取argument。

ViewHolder和Adapter

RecycleView自身不会创建视图,它创建的是ViewHolder,而ViewHolder引用着itemView              Adapter负责创建和绑定

ConstraintLayout

给CrimeFragment填充数据

使用之前学到的方法用Intent传递数据,在CrimeFragment的onCreate()中从Intent读取数据。

首先定义一个id

public static final String EXTRA_CRIME_ID =

"com.example.lijing.criminalintent.crime_id";

…..

然后在onCreate()中

UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);

mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);

数据在CrimeListFragment中startActivity()之

putExtra(CrimeFragment.EXTRA_CRIME_ID,c.getId());

CriminalIntent开发(二)_第6张图片

修改好的布局

约束的XML形式

CriminalIntent开发(二)_第7张图片

界面之间传递数据的改进

原先的代码如下

UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);

在这段代码中crimeId是存储在CrimeActivity中的。现在将它由CrimeActivity的intent内的extra改为arguments bundle。每个fragment实例都可以附带一个Bundle对象。该bundle包含有key-value对,我们可以如同附加extra到Activity的intent中那样使用它们。一个key-value对即一个argument。

UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);

并给fragment一个newInstance()来创建自己,并在这个静态方法里创建arguments。

总的来说就是由以前从Activity中获取参数,改成从自己的存储区里获取参数。而自己的存储区里的参数是在创建该fragment是写入的。

使用fragment argument

CriminalIntent开发(二)_第8张图片

使用ViewPager

CriminalIntent开发(二)_第9张图片

大体布局

CriminalIntent开发(二)_第10张图片

为了实现向左滑向右滑的这种效果,我们需要创建一个ViewPager的activity,命名为CrimePagerActivity来取代CrimeActivity。本章采用了以代码的方式创建视图它包含以下步骤:

为ViewPager创建资源ID;

创建ViewPager实例并赋值给mViewPager;

赋值资源ID给ViewPager,并对其进行配置;

设置ViewPager为activity的内容视图。

你可能感兴趣的:(CriminalIntent开发(二))