Hack21 与Activity生命周期绑定的Broadcast Receiver
问题:在Activity中使用Broadcast Receiver对象监听广播需要注意什么?
解决方案:在Activity中自定义 Broadcast Receiver,重写 onReceive() 方法,根据接收到的广播执行代码。要注意根据Activity的生命周期决定Broadcast Receiver的生命周期。
Hack22 使用Android库项目时适用的架构模式
问题:Android项目间如何共享代码?
解决方案:在以前使用Eclipse的时候,开发者需要手动引入Jar文件,非常麻烦。Android Studio使用 Gradle 作为项目构建工具,能够提供最大的便利去构建工程。如果某个项目并没有提供相关的依赖包,Android Studio可以直接把该项目以 Module 的形式引入,两个Module之间的代码可以共享。
Hack23 同步适配器模式
问题:同步适配器如何使用?
解决方案:同步适配器框架是Android提供的一套移动端与服务端数据同步的解决方案,它具有以下优点——插件化结构、自动执行、自动检测网络、省电、有账户认证机制等。最常见的是用于备份,联系人同步等各种云同步功能。
SyncAdapter依赖于自定义账户和ContentProvider。SyncAdapter 类继承自 AbstractThreadedSyncAdapter,在构造方法中初始化需要用到的组件,比如初始化一个ContentResolver。除了构造方法外只有 onPerformSync() 方法需要实现,这是真正要运行的同步方法,这个方法运行在独立的线程中,其中可以进行联网耗时操作。
Hack24 处理空列表
问题:使用列表展示数据时,列表为空怎么办?
解决方案:在布局文件中,编写列表为空时要显示的TextView或ImageView,并设置其为 android:visibility=”gone”。在加载数据后判断列表是否为空,如果为空则将其显示出来。
Hack25 通过ViewHolder优化适配器
问题:ViewHolder怎么用?
解决方案:ListView已经很少被使用,在此我们讨论 RecyclerView 中ViewHolder的使用方式。Adapter对象是ListView和底层数据间的桥梁。Adapter用于访问数据项,并且负责为数据项生成视图。在RecyclerView中,Adapter 像是 ViewHolder的集合,ViewHolder负责绑定列表中的条目视图,而且可以被 回收 循环使用。
Hack26 为ListView添加分段标头
问题:带有分段标头的列表如何创建?
解决方案:在每个 ListItem 中加入一个 TextView 作为 Header,根据其首字母与前一项首字母相等与否决定Header是否可见。在ListView上方设置一个Header,获取页面最上方的Item的position,将其首字母设为最上方Header显示的内容。
Hack27 使用Activity和Delegate与适配器交互
问题:委托模式如何使用?
解决方案:委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。
在本项目中,所有业务逻辑从适配器中移到Activity中,通过一个委托接口调用Activity的方法删除对象。而当适配器需要使用Activity中的方法时,直接使用委托对象进行操作。实际上,传入的委托对象正是实现了 NumbersAdapterDelegate 接口的 Activity。
委托模式有效地避免了继承的滥用。
Hack28 充分利用ListView的头视图
问题:ListView头视图如何使用?
解决方案:其实 HeaderView 实际上也是Item的一种,只不过显示在顶部的位置,那么我们完全可以通过为其设置 ItemType 来完成。比较常见的实现方式为:继承 RecyclerView.Adapter 类并重写 onCreateViewHolder()、getItemViewType()、onBindViewHolder() 等方法,最后添加 addHeaderView()、getHeadersCount() 等方法。
Hack29 在ViewPager中处理转屏
问题:在Activity中如何处理转屏?
解决方案:可以在Activity中使用 setRequestedOrientation() 方法强制改变屏幕方向,但除了播放视频、开启游戏等情况以外,请勿轻易改变屏幕方向以免引起用户反感。
Hack30 ListView的选择模式
问题:默认情况下,列表是没有选择行为的。如何设置列表的选择模式?
解决方案:ListView中 choiceMode 属性可以设置列表的选择行为,如果需要ListView处理 选择行为,还需要创建自定义视图并实现 Checkable 接口。CheckBox是可获取焦点的控件,如果需要扩展其点击事件,则需将其设置为不允许获取焦点。
1 | android:clickable="false" |