参考Android连载课程
协调交互原理讲解
CoordinatorLayout 是一个整体的ViewGroup,它的主要作用是协调各个子View之间的滑动交互,也就是Behavior,后期我们会详细讲一下怎么来自定义Behavior。
来源于design包下的控件

Design控件、RadioGroup
- 什么是Design
全称是Android Material Design,是一套全新的控件库,里面包含AppBarLayout、CollapsingToolbarLayout、CoordinatorLayout(都是design包下的控件),FloatingActionButton、NavigationView、Snackbar、TabLayout、TextInputLayout这八种控件。
2、RadioGroup 和 RadioButton常常组合起来使用,RadioButton是一种点选操作按钮,开发有时也会用TextView做替代,只是RadioButton更方便一些。
AppBarLayout:首先,AppBarLayout是一个LinearLayout,它的子View默认纵向排列, 可以通过一些参数控制子View的滑动行为。
AppBarLayout:对下面的子控件提供一些layout_scrollFlags属性的配置
layout_scrollFlags配置详细说明:
全局滑动事件处理
Scroll:跟着滑动的方向进行滑动,如果不配置会一直在屏幕中静态显示(也就是滑不动)。

Snap:这个属性有个很明显回弹效果,当滑动距离过短时,会回弹到最近的上边缘或者下边缘。
app:layout_scrollFlags="scroll|snap"
向下滑动事件处理
EnterAlways:这个属性其实就是向下滚动时Scrolling View(指NestedScrollView)和Child View(指AppBarLayout包裹的内容)之间的滚动优先级问题,当向下滚动时,优先滑出Child View,当全部滑出时,再去处理Scrolling View的滑动事件。
app:layout_scrollFlags="scroll|snap|enterAlways"运行效果:先处理父布局滑动

EnterAlwaysCollapsed:这个属性是上个属性的附加值,这里涉及到Child View的高度和最小高度,向下滚动时,Child View先向下滚动最小高度值,然后Scrolling View开始滚动,到达边界时,Child View再向下滚动,直至显示完全。

向上滑动事件处理
ExitUntilCollapsed:这里也涉及到最小高度。发生向上滚动事件时,Child View向上滚动退出直至最小高度,然后Scrolling View开始滚动。也就是,Child View不会完全退出屏幕。
CollapsingToolbarLayout:实现Toolbar的折叠效果,所以去掉enterAlwaysCollapsed,防止toolBar总是在屏幕最上方。

contentScrim:折叠后的颜色

运行效果:

任何一个滑动的控件都是有监听的
layout_collapseMode:pin 滑动时会固定到屏幕上,不会折叠,parallax会发生折叠,并带有一定的视差特效效果,视差特效的比例由layout_collapseParallaxMultiplier来控制。
运行效果:图片折叠不那么死板了


这样就出现视频填充错误: ScrollView只能容纳一个直接child,所以只能把view控件放在LinearLayout布局下


Behavior: 处理交互的,其中最主要有两个知识点,依赖方和被依赖方。
目前用的系统的这个Behavior 被依赖的是 AppBarLayout,依赖的就是我们下面的整个布局。
NestedScrollView覆盖了AppBarLayout,导致图片无法显示,加入下面语句


可以垂直滚动的{@link View}s 应该使用的行为,并支持嵌套滚动,以自动滚动任何{@link AppBarLayout}sibings兄弟。

测试:往下滑动,打印的日志verticalOffset都是负的(<=0)


@Override
public void afterBindView() {
shanghaiAppBarlayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
Log.e("shanghaiAppBarlayout", "verticalOffset=" + verticalOffset + "appBarLayout=" + appBarLayout.getMeasuredHeight());
if (-verticalOffset < appBarLayout.getMeasuredHeight() / 2) {
//说明它在布局的上半部分
tvShanghaiWelcome.setVisibility(View.INVISIBLE);
} else {
tvShanghaiWelcome.setVisibility(View.VISIBLE);
}
}
});
}当加了一下这行

模仿微博热搜


布局源码
<?xml version="1.0" encoding="utf-8"?>
<!--最外层必须是CoordinatorLayout,可以处理一些滑动事件-->
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/shanghai_app_barlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--CollapsingToolbarLayout可以折叠的布局
app:layout_scrollFlags="scroll" 如果不滑动会一直停在屏幕中间
-->
<android.support.design.widget.CollapsingToolbarLayout
app:contentScrim="@color/colorPrimaryDark"
app:layout_scrollFlags="scroll|snap|enterAlways|exitUntilCollapsed"
android:id="@+id/shanghai_collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.6"
android:scaleType="centerCrop"
android:src="@mipmap/shanghai"
android:layout_width="match_parent"
android:layout_height="200dp" />
<!--app:layout_collapseMode="pin" 可以停留在屏幕上面的,不会折叠-->
<android.support.v7.widget.Toolbar
app:layout_collapseMode="pin"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<TextView
android:id="@+id/tv_shanghai_welcome"
android:textColor="@color/color_black_30"
android:gravity="center"
android:visibility="gone"
android:text="上海欢迎您"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
<TextView
android:textColor="@color/color_black_30"
android:gravity="center"
android:text="我能停留,可用于水平滑动"
android:layout_width="match_parent"
android:layout_height="50dp" />
</android.support.design.widget.AppBarLayout>
<!--嵌套滚动使用-->
<android.support.v4.widget.NestedScrollView
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:background="@color/color_gray"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:textColor="@color/color_ffffff"
android:gravity="center"
android:text="@string/str_main_shanghai"
android:layout_width="match_parent"
android:layout_height="50dp" />
...
<TextView
android:textColor="@color/color_ffffff"
android:gravity="center"
android:text="@string/str_main_shanghai"
android:layout_width="match_parent"
android:layout_height="50dp" />
<TextView
android:textColor="@color/color_ffffff"
android:gravity="center"
android:text="@string/str_main_shanghai"
android:layout_width="match_parent"
android:layout_height="50dp" />
...
<TextView
android:textColor="@color/color_ffffff"
android:gravity="center"
android:text="@string/str_main_shanghai"
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>app:layout_behavior="@string/appbar_scrolling_view_behavior"
<!--在背景图片的下面-->
TabLayout+ViewPager+Fragment
ViewPager中的Adapter:(https://blog.csdn.net/rankun1/article/details/51842471)
主要涉及这几个类,PagerAdapter、FragmentStatePagerAdapter、FragmentPagerAdapter。
PagerAdapter:原始基类。
FragmentPagerAdapter:继承PagerAdapter,适用页数小的静态页面,所有Fragment会保存到内存当中,Fragment切换时只会走到 onDestoryView这个生命周期。
FragmentStatePagerAdapter:继承PagerAdapter,适用页数多的动态页面,Fragment切换时会走到onDetach这个生命周期。
Recyclerview
几个重要的角色
1、Recycler
管理那些已经废弃了的或者从RecyclerView中分离的item view用于复用,主要用于缓存的设计。
一共四层缓存:
* 1.一级缓存:mAttachedScrap
* 2.二级缓存:mCacheViews
* 3.三级缓存:mViewCacheExtension
* 4.四级缓存:mRecyclerPool提取大段代码到方法 Ctrl + Alt + M(Windows/Linux上) 参考 https://www.jianshu.com/p/d3fb77a2ea68

2、LayoutManager
LayoutManager是一个抽象类(可自定义),有3个子类:
- LinearLayoutManager 线性布局管理器
- GridLayoutManager 表格布局管理器
- StaggeredGridLayoutManager 瀑布流布局管理器
参考 https://www.jianshu.com/p/2f415100755c

ViewHolder主要用来缓存view的(每个条目创建时,都是通过RecyclerView.ViewHolder来做的)

3、Adapter
适配器设计模式,把相应数据Data展示到不同的 布局View 中。
4、高级用法
复杂条目、设置监听时机、缓存池的应用。
RecyclerView inflate布局时 传入的三个参数具体有什么关系?涉及系统源码
- root 不为null attachToRoot 为false,则子View会设置 root的 LayoutParams。
- root 不为null attachToRoot 为 ture,则root会把子view添加进来。
- root 为 null RecycleView 会默认给子View生成一个默认的LayoutParams,所以会导致条目展示问题。
tryGetViewHolderForPositionByDeadline
Adapter简易封装及原理
- 使用的是RecyclerView中的Adapter
- 自定义ViewHolder
- SparseArray原理
- CharSequence与String的关系 富文本
ShangHarAdapter

View来自的BaseFragment返回的填充

设置参数提示


通过这里拿到

从外部传入

代码编写顺序:
- ShanghaiViewHolder extends RecyclerView.ViewHolder
- onBindViewHolder
- RecyclerView.ViewHolder onCreateViewHolder

没有填充板
如果填充布局是LinearLayout时,记得配置parent和false两个参数
