时, 如果用户尝试竖直滚动, touch事件实际上是被child吃掉的.
还是从onInterceptTouchEvent()
的代码可以看出:
if (mScrollState == SCROLL_STATE_SETTLING) {
getParent().requestDisallowInterceptTouchEvent(true);
setScrollState(SCROLL_STATE_DRAGGING);
}
当child处于SETTLING状态时, child会要求它的parent不要拦截touch事件.
这在通常情况下是好的.
但是在作者的使用场景里, 他们的root中没有其他竖直滚动和拖拽的child, 所以他们又继承了刚才那个BetterRecyclerView, 写了一个requestDisallowInterceptTouchEvent()
为空实现的View作为root.
他们的sample demo在这里: manidesto/scrolling-demo.
每一个Android开发可能都需要对他们的项目进行(更新依赖, 编码, 重复)这样的循环工作, 如果你想要你的所有项目都有同样的版本号, 这样是很浪费时间的.
原文作者就经历了这样的情景, 他想要把他这个目录Android-Examples下的所有项目都更新一下. 这个目录里全是那种很小的简单例子, 但都是可独立运行的工程.
每当gradle-plugin, support library或者google play services要更新版本号, 保持这些工程全部都updated是一项很难的工作.
所以原作者想要放弃原先逐个更新的土办法, 更有效率地来更新依赖版本号.
首先想到的就是在gradle里定义一个变量, 然后双引号加$引用这个变量.
为了让所有的module都采用同一变量, 可以在根项目的build.gradle文件里定义变量, 即使用ext块.
但是到此, 只能统一管理在同一个project下的各个modules的依赖版本.
如果跨projects呢?
首先, 作者在存放这些projects的根目录下建了一个gradle文件, 然后把变量都定义在那里.
然后如何应用到各个project呢?于是原作者找啊找, 找到了这块: gradle Subproject configuration
他给每个工程的根build文件加了个这个:
// This is added to apply the gradle file to each module under the project
subprojects {
apply from: '../../dependencies.gradle'
}
这样以后在每个工程的module里面都可以直接引用变量了.
但是, 这对于android-gradle-plugin的版本是不管用的.
这是因为上面应用的配置只对subproject起作用, 对每一个root project是没有应用到的.
所以作者在每一个项目的root build.gradle中, 在buildscript块又加了它的依赖配置文件:
buildscript {
// This is added to apply the gradle file to facilitate providing variable values to root build.gradle of the project
apply from: '../dependencies.gradle'
..
dependencies {
classpath "com.android.tools.build:gradle:$androidPluginVer"
..
}
}
好啦, 至此, 所有的依赖配置问题就解决了, 以后改版本号只需要改一个地方就可以应用到所有项目.
作者上一篇的文章里介绍了Dagger的基本使用.
这篇还是教程类文章, 讲:
多个Modules:
写了一个Retrofit 2的ApiModule, 和一个Realm的DatabaseModule.
多个对象:
有时候我们需要提供一个类的不同对象, 我们可以用@Named
注解, 然后用不同的字符串来区分它们.
文中的例子是这样:
@Provides
@Named(IMAGE_URL)
String provideImageUrl() {
return ImageApiService.ENDPOINT;
}
@Provides
@Named(URL)
String provideBaseUrl() {
return RestApiService.ENDPOINT;
}
@Provides @Singleton @Named(REST_API_RETROFIT)
Retrofit provideRetrofit(@Named(URL) String baseUrl, OkHttpClient client) { ... }
@Provides @Singleton @Named(IMAGE_API_RETROFIT)
Retrofit provideImageRetrofit(@Named(IMAGE_URL) String baseUrl, OkHttpClient client) { ... }
用dagger2注入接口, 返回实现类的对象, 比较常规的方法是在Module里面写一个@Provides
标注的providesXXX()方法, 返回值类型是接口, 实际返回的是实现类的对象, 比如:
@Module
public class HomeModule {
@Provides
public HomePresenter providesHomePresenter(){
return new HomePresenterImp();
}
}
但是如果我们想给实现类加一个依赖UserService呢?
我们当然可以把UserService作为参数传给这个provide方法, 然后传到实现类的构造函数中, 在里面存一个字段.
又或者, 我们可以使用@Binds
注解, 像这样:
@Module
public abstract class HomeModule {
@Binds
public abstract HomePresenter bindHomePresenter(HomePresenterImp
homePresenterImp);
}
这是一个抽象类中的抽象方法, 这个方法的签名意思是告诉dagger, 注入HomePresenter
接口(返回值)时, 使用HomePresenterImpl
(方法参数)实现.
然后, 在HomePresenterImpl
类的构造函数上加一个@Inject
就可以了.
这样我们就不需要在provide方法上加依赖参数了.
本文介绍expandable-recycler-view, 一个开源的库, 可以展开和折叠RecyclerView中的组.
RecyclerView
作为ListView
的升级版, 却也减少了一些功能比如OnItemClickListe