RecyclerView

Question

https://www.bilibili.com/video/BV1Fi4y1x7p5?from=search&seid=3244755609076396172

  1. RecycleView复用机制

  2. 问题3

    适配不同类型的View布局,将用户界面显示与逻辑代码分离

基本使用

https://github.com/googlesamples/android-RecyclerView

http://blog.csdn.net/lmj623565791/article/details/51854533

http://blog.csdn.net/qibin0506/article/details/49716795

滑动

RecyclerView系列_苏火火丶的博客-CSDN博客

我们在拖动DependencyView的时候,ImageView也跟随着DependencyView移动。当然这种依赖并非只有一对一的关系,也可能是一对多或者多对多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_head"
app:layout_behavior="com.antiphon.recyclerviewdemo.weight.MyBehavior" />

<com.antiphon.recyclerviewdemo.weight.DependencyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:padding="4dp"
android:text="DependencyView"
android:textColor="#fff"
android:textSize="18sp" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

复用分析

分析onCreateViewHolder onBindViewHolder和 view是怎么复用的

https://www.jianshu.com/p/ec6585e5220d

滑动坐标

第一个左边 - 第二个坐标

所以负值 一定是往下滑

用栈数组保存不同类型回收的view

回收情况

ScrollY 第一个可见Item的左上顶点 距离屏幕左上角的距离。

顶部item回收
  1. 往上滑动

​ 当顶部item滑出屏幕,ScrollY的高度等于第一个item高度时,就被滑出了屏幕。

​ 底部item再添加

  1. 网上滑动

​ 当 屏幕显示的几个Item 长度 - ScrollY 刚好等于 屏幕高度,底部item之下再开始添加item。

​ 因为ScrollY变大.

顶部item添加

向下滑动

ScrollY = 顶部item高度,顶部添加item

底部item回收

ScrollY = 底部item高度,底部回收。

Jectpack Paging

https://developer.android.com/topic/libraries/architecture/paging

https://www.youtube.com/watch?v=BE5bsyGGLf4&t=841s

https://codelabs.developers.google.com/codelabs/android-paging/index.html?index=..%2F..%2Findex#1

ItemKeyedDataSource的子类需要实现loadInitial、loadAfter、loadBefore和getKey方法。它们分别的作用如下:

https://github.com/fmtjava/Jetpack_GitHub

https://github.com/Hankkin/JetPack_Note

解释 paging diff

http://www.jeepxie.net/article/25492.html

https://www.jianshu.com/p/bbb96fc62bcd

https://www.jianshu.com/p/10bf4bf59122

https://juejin.im/post/5db06bb6518825646d79070b

Item分类

前面添加header, footer就用到了item分类
reclverview也有很多分类方式

  • 使用adapter 组合设计模式,进行组装,代码简洁,比较好操作
    多adapter分类

https://github.com/luizgrp/SectionedRecyclerViewAdapter
http://blog.csdn.net/wzlyd1/article/details/52292548
https://github.com/luizgrp/SectionedRecyclerViewAdapter

https://github.com/donkingliang/GroupedRecyclerViewAdapter

https://mp.weixin.qq.com/s/oCl4BQ8uB9ZDSOEKESM7hA

复杂布局: https://github.com/385841539/RecycleviewStaggered

竖直嵌套水平:https://github.com/drakeet/MultiType/issues/67

preview

https://medium.com/aubergine-solutions/creating-recyclerview-layout-in-android-no-pain-only-gain-404280471003

1
2
tools:itemCount="5"
tools:listitem="@layout/adapter_red_pack"
1
tools:src="@sample/RedPack.json/dataList/redEnvelopeMoney"

问题

使用recycleView中会遇到一些问题,总结一下

  1. 问题1
    下拉刷新 滑动列表 crash

使用下拉刷新的时候 往上滑动item会出现这样的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
E/CrashReport: sys default last handle start!
FATAL EXCEPTION: main
Process: com.huifu, PID: 22865
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 4(offset:4).state:10
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5504)
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:282)
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:336)
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:349)
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:356)
at android.support.v7.widget.GapWorker.run(GapWorker.java:387)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

刷新之后数据清空,再滑动数据和item不一致, 情况数据应该在拿到数据之后, 使用下面这种方式解决问题,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    @Override
public void onRefresh() {
// if (!mProjectList.isEmpty()) {
// mProjectList.clear();
// }
start = 0;
loadData();
}
//拿到数据后

public void onSuccess(List<Project> projects) {
swipeInvest.setRefreshing(false);
isloading = false;
if (start == 0) mProjectList.clear();
}

http://blog.csdn.net/weixiao_812/article/details/78138075
下拉刷新时快速滑动崩溃的问题解决

  1. 问题2

界面不能展示 ,和ListView 不同的是RecyclerView不同,没设置下面的参数是不显示的

1
2
mLayoutManager = new LinearLayoutManager(getActivity());
rcvRrecord.setLayoutManager(mLayoutManager);

如果还是没有就看看 recycleview布局是否显示

https://blog.csdn.net/mjb00000/article/details/106014544

不用等数据来了后再显示

https://github.com/leobert-lan/Pandora

RecyclerView拖拽功能

https://www.jianshu.com/p/9605d14ddcc2

https://www.jianshu.com/p/b9a22f0c537d

https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf

drag禁用

https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/3378

BaseRecyclerViewAdapterHelper

getLayoutPosition getAdapterPosition区别

如果界面在notifyDataSetChanged()刷新所有数据,获取的adapterPosition 有可能会是-1,而layoutPosition获取到的还是旧的值.
如果使用但如果用的是notifyItemInserted(0),获取的adapterPosition就能立刻获取到新的值.

作者:JimmyZou92
链接:https://juejin.cn/post/6999213411204595720
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【世纪纠结】Jetpack Compose 和自定义 View,学哪个?


RecyclerView
https://noteforme.github.io/2017/07/17/RecyclerView/
Author
Jon
Posted on
July 17, 2017
Licensed under