文章目录
一 前言
1.1 参考资料与预期目标
创建一个 RecyclerView LayoutManager – Part 1
创建 RecyclerView LayoutManager – Part 2
创建 RecyclerView LayoutManager – Part 3
10 steps to create a custom LayoutManager
玩转仿探探卡片式滑动效果
自定义LayoutManager简明教程
自定义控件三部曲视图篇(六)
RecyclerView.LayoutManager的常用相关方法
我用过这篇文章的开源库,但是我感觉不是特别好,
我想像岛读APP一样的效果
1.2 ItemTouchHelper与CallBack
详细看了一下玩转仿探探卡片式滑动效果,发现用到了了之前学习的CallBack。来回顾一下:
ItemTouchHelper
是干什么用的?它是帮助RecyclerView完成滑动和拖拽而制作的工具类
它是什么帮助你的?
//这个adapter就是RecyclerAdapter
ItemTouchHelper.Callback callback = new Card_Recycler_Callback(adapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(recyclerView);
通过设置Callback
而且既然是用RecyclerView实现的,这篇文章就当做RecycleView的第二篇文把。
二 样式实现
参考:创建一个 RecyclerView LayoutManager – Part 1
2.1 自定义LayoutManager
2.1.1 generateDefaultLayoutParams()方法
public class CardLayoutManager extends RecyclerView.LayoutManager {
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams
(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
这是一旦继承RecyclerView.LayoutManager
之后就需要实现的一个方法。这个方法是什么用的呢?
参考资料1:
通过读上面的注释和代码,可以知道原来平常我们调用addView
的方法时,不指定LayoutParams
,是通过generateDefaultLayoutParams()
获取默认的LayoutParams
属性的。
创建一个 RecyclerView LayoutManager – Part 1:
generateDefaultLayoutParams() 事实上你只要重写这个方法你的 LayoutManager 就能编译通过了。 实现也很简单,返回一个你想要默认应用给所有从 Recycler 中获得的子视图做参数的 RecyclerView.LayoutParams 实例。 这些参数会在对应的 getViewForPosition() 返回前赋值给相应的子视图。
2.1.2 onLayoutChildren()方法
这个方法的作用:
onLayoutChildren() 是 LayoutManager 的主入口。 它会在 view 需要初始化布局时调用, 当适配器的数据改变时(或者整个适配器被换掉时)会再次调用。 注意!这个方法不是在每次你对布局作出改变时调用的。 它是 初始化布局 或者 在数据改变时重置子视图布局的好位置。
也就是说,这个方法会在初始化布局,和adapter数据更新的时候调用。那应该些什么?怎么写呢?
参考代码 - 玩转仿探探卡片式滑动效果 布局考虑,这里就不贴完整代码了
首先学习会使用到的API,来自:创建一个 RecyclerView LayoutManager – Part 1
2.1.2.1 Detach vs. Remove
- Detach 是一个轻量的记录 view 操作。 被 detach 的视图在你的代码返回前能够重新连接。
- Remove 意味着这个 view 已经不需要了。任何被永久移除的 view 都应该 放到 Recycler 中,方便以后重用
2.1.2.2 Scrap vs. Recycle
scrap heap 和 recycle pool (垃圾堆和回收池)
- Scrap heap 是一个轻量的集合,视图可以不经过适配器直接返回给 LayoutManager 。通常被 detach但会在同一布局重新使用的视图会临时储存在这里。
当要给 LayoutManager 提供一个新 view 时,Recycler 首先会 检查 scrap heap 有没有对应的 position/id;如果有对应的内容, 就直接返回数据不需要通过适配器重新绑定。- Recycle pool 存放的 是那些假定并没有得到正确数据(相应位置的数据)的视图, 因此它们都要经过适配器重新绑定后才能返回给 LayoutManager。
当要给 LayoutManager 提供一个新 view 时,Recycler 首先会 检查 scrap heap 有没有对应的 position/id;
如果没有的话, Recycler 就会从 recycle pool 里弄一个合适的视图出来, 然后用 adapter 给它绑定必要的数据 (就是调用RecyclerView.Adapter.bindViewHolder()) 再返回。 如果 recycle pool 中也不存在有效 view ,就会在绑定数据前 创建新的 view (就是 RecyclerView.Adapter.createViewHolder()), 最后返回数据。
综上两个比较:
通常来说, 如果你想要临时整理并且希望稍后在同一布局中重新使用某个 view 的话, 可以对它调用 detachAndScrapView()
。如果基于当前布局 你不再需要某个 view 的话,对其调用 removeAndRecycleView()
。
只要你原意,LayoutManager 的 API 允许你独立完成所有这些任务, 所以可能的组合有点多。通常来说, 如果你想要临时整理并且希望稍后在同一布局中重新使用某个 view 的话, 可以对它调用 detachAndScrapView() 。如果基于当前布局 你不再需要某个 view 的话,对其调用 removeAndRecycleView()。
2.1.2.3 实践1-让一个最简单的子布局显示出来
a 代码实践
照着玩转仿探探卡片式滑动效果去实现,完全失败了。根本显示不出图来。不知道为什么。
自定义控件三部曲视图篇(六