英语原文共 73 页,剩余内容已隐藏,支付完成后下载完整资料
安卓编程:The Big Nerd Ranch Guide
作者:比尔 菲利普斯,克里斯 斯图尔特和克里斯 汀玛斯卡诺
版权所有copy; 2017 Big Nerd Ranch, LLC.
保留所有权利。在美利坚合众国印刷。本出版物受版权保护,在任何禁止复制、在检索系统中存储、或以任何形式或任何方式传输、电子、机械、复印、录音或类似的方式传播之前,必须先获得出版商的许可。有关权限的信息,请联系。
book-comments@bignerdranch.com
带有螺旋桨标志的10加仑帽子是Big Nerd Ranch公司 的商标,它是这本书的英文版本的全球发行版。
皮尔森科技集团
东96街800号
美国印第安纳波利斯,46240年
作者和出版商在撰写和印刷这本书时都很谨慎,但没有任何形式的明示或默示保证,也不承担任何错误或遗漏的责任。不承担因使用本合同所载的信息或程序而产生的附带或间接损害的责任。
许多制造商和销售商用来区分他们的产品的设计被认为是商标。在这本书中,这些名字出现在书中,出版商意识到了商标的所有权,这些名称已经印上了大写字母或大写字母。
ISBN-10 0134706099
ISBN-13 978-0134706092
第三版,第一次印刷,2017年2月发布。
第八章 用RecyclerView显示列表
CriminalIntent的模型层目前由一个单一的Crime实例组成。在这一章中,你将更新CriminalIntent,以处理一系列Crime。列表将显示每个Crime的标题和日期,如图8.1所示。
图8.1 Crime列表
图8.2显示了本章的犯罪意图总体规划
图8.2
在模型层中,你有一个新的对象,CrimeLab,它将是Crime的集中数据存储对象。
显示Crime列表需要一个新的活动和一个新的片段在CriminalIntent的控制器层:CrimeListActivity和crimelist片段。(图2中的CrimeActivity和crime片段在哪里?它们是细节视图的一部分,所以我们没有在这里显示它们。在第10章中,您将连接CriminalIntent的列表和详细部分。)
在图8.2中,您还可以看到与CrimeListActivity和crimelist片段相关联的视图对象。该活动的视图将包含一个包含片段的框架。片段的视图将由一个回收的视图组成。稍后您将在本章中了解更多关于回收的erview类的知识。
更新CriminalIntent的模型层
第一步是将CriminalIntent的模型层从一个Crime对象升级到Crime列表对象
单例和集中数据存储
你将把Crime列表存储在一个单例中。单件是一个只允许创建一个自身实例的类。
只要应用程序停留在内存中,就存在单例模式,因此将列表存储在单件中,将使Crime数据在您的活动和片段的任何生命周期更改中都可用。注意单例类,因为当Android从内存中删除应用程序时,它们将被销毁。CrimeLab单件并不是长期存储数据的解决方案,但它确实允许应用程序拥有crime数据的一个所有者,并提供了一种在控制器类之间轻松传递数据的方法。(您将在第14章中了解更多关于长期数据存储的信息。)
(请参阅本章末尾的更有趣的部分,了解更多关于单例类的内容。)
要创建单件,您可以使用私家构造函数和get()方法创建一个类。如果实例已经存在,那么get()只是返回实例。如果实例还不存在,那么get()将调用构造函数来创建它。
右键单击com.bignerdranch.android。犯罪意图包并选择新的Java类。命名这个类CrimeLab并单击OK。
在CrimeLab。java,将CrimeLab作为一个单例对象,带有私有构造器和get()方法。
8.1设置singleton(CrimeLab.java)
public class CrimeLab {
private static CrimeLab sCrimeLab;
public static CrimeLab get(Context context)
{ if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(context);
}
return sCrimeLab;
}
private CrimeLab(Context context) {
}
}
在这个CrimeLab实现中有一些有趣的事情。首先,注意在sCrimeLab变量上的s前缀。您正在使用这个Android
另外,请注意CrimeLab上的私有构造函数。其他类将无法创建一个CrimeLab绕过get()方法。
约定来说明sCrimeLab是一个静态变量。
最后,在CrimeLab上的get()方法中,传入一个上下文对象。你会利用这个第14章的上下文对象。
让我们给CrimeLab一些Crime物品来储存。在CrimeLab的构造函数中,创建一个空的Crime列表。另外,添加两种方法:返回List的getCrime()方法和一个getCrime(UUID),它用给定的ID返回Crime。
8.2设置犯罪对象列表(CrimeLab.java)
Public class CrimeLab {
private static CrimeLab sCrimeLab;
private Listlt;Crimegt; mCrimes;
public static CrimeLab get(Context context) {
...
}
private CrimeLab(Context context) {
mCrimes = new ArrayListlt;gt;();
}
public Listlt;Crimegt; getCrimes()
{ return mCrimes;
}
public Crime getCrime(UUID id)
{ for (Crime crime : mCrimes)
{
if (crime.getId().equals(id))
{ return crime;
}
}
return null;
}
}
List是一个接口,它支持给定类型的物体的有序列表。它定义了检索、添加和删除元素的方法。List的一个常用实现是ArrayList,它使用一个常规的Java数组来存储列表元素。
因为mCrimes拥有一个ArrayList——ArrayList也是一个列表——ArrayList和List都是mCrimes的有效类型。在这种情况下,我们建议使用变量声明:List的接口类型。这样,如果您需要使用一种不同类型的列表实现——例如LinkedList,您可以很容易地做到这一点。
mCrimes实例化线使用的是在Java 7中引入的菱形符号。这个简短的符号告诉编译器根据在变量声明中传递的通用参数来推断列表将包含的条目的类型。在这里,编译器会推断ArrayList包含Crime,因为变量声明私有列表是mCrime;为一般论证指定Crime。(在Java 7之前,开发人员需要使用的更详细的等价物是mCrimes=新的ArrayList();。)
最终,该列表将包含用户创建的Crime,这些Crime可以被保存和重新加载。现在,用100个无聊的Crime对象填充这个列表。
8.3生成Crimes(CrimeLab.java)
private CrimeLab(Context context)
{ mCrimes = new ArrayListlt;gt;();
for (int i = 0; i lt; 100; i ) { Crime crime = new Crime(); crime.setTitle('Crime #' i);
crime.setSolved(i % 2 == 0); // Every other one mCrimes.add(crime);
}
}
现在你有了一个全负荷的模型层,有100个Crime。
一个用于承载片段的抽象活动
稍后,您将创建CrimeListActivity类来承载crimelist片段。首先,您将为CrimeListActivity设置一个视图。
一个通用的fragment-hosting布局
对于CrimeListActivity,您可以简单地重用在activity犯罪率中定义的布局。xml(如清单4所示)。这个布局提供了一个框架,作为一个片段的容器视图,然后在活动的代码中命名。
8.4 activity_crime。xml已经是通用的
lt;/xml version='1.0' encoding='utf-8'?gt;
lt;FrameLayout xmlns:android='http://schemas.android.com/apk/res/android' android:id='@ id/fragment_container' android:layout_width='match_parent' android:layout_height='match_parent'
/gt;
因为activity_crime。xml没有指定一个特定的片段,您可以将它用于承载单个片段的任何活动。activity_fragment重命名它。xml以反映其更大的范围。
在项目工具窗口中,右键单击re/layout/activitycri.xml。(一定要右键单击activity_crime。xml而不是fragment_crime.xml。)
从上下文菜单中,选择重构重命名这个布局activity分段.xml然后单击重构。
当您重命名一个资源时,对它的引用应该自动更新。如果你在CrimeActivity中看到一个错误。然后,您需要手动更新CrimeActivity中的引用,如清单5所示。
8.5更新用于CrimeActivity(crimeactivit.java)的布局文件
public class CrimeActivity extends AppCompatActivity {
/ Called when the activity is first created. / @Override
protected void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_crime); setContentView(R.layout.activity_fragment);
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null) {
fragment = new CrimeFragment(); fm.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
}
}
一个抽象类活动
要创建CrimeListActivity类,您可以重用CrimeActivity的代码。回头看看您为CrimeActivity编写的代码(如清单6所示)。它很简单,而且几乎是通用的。事实上,唯一的非泛型代码是crime片段的实例化,然后再将其添加到FragmentManager中。
8.6的CrimeActivity几乎是通用的(crimeactivit.java)
public class CrimeActivit
全文共49917字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[13902],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。