Bootstrap

项目实践-RecyclerView(二) - 卡片叠放侧滑

一 前言

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
  1. Detach 是一个轻量的记录 view 操作。 被 detach 的视图在你的代码返回前能够重新连接。
  2. Remove 意味着这个 view 已经不需要了。任何被永久移除的 view 都应该 放到 Recycler 中,方便以后重用
2.1.2.2 Scrap vs. Recycle

scrap heap 和 recycle pool (垃圾堆和回收池)

  1. Scrap heap 是一个轻量的集合,视图可以不经过适配器直接返回给 LayoutManager 。通常被 detach但会在同一布局重新使用的视图会临时储存在这里。
    当要给 LayoutManager 提供一个新 view 时,Recycler 首先会 检查 scrap heap 有没有对应的 position/id;如果有对应的内容, 就直接返回数据不需要通过适配器重新绑定。
  2. 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 代码实践

照着玩转仿探探卡片式滑动效果去实现,完全失败了。根本显示不出图来。不知道为什么。
自定义控件三部曲视图篇(六࿰

;