MultiType icon indicating copy to clipboard operation
MultiType copied to clipboard

嵌套使用,ItemViewDelegate对象出现多次重复加载,一直死循环。

Open graysonwu2018 opened this issue 3 years ago • 7 comments

SmartRefreshView + Multitype使用没有问题,数据可以正常加载。 ViewPager2 + Multitype使用没有问题,数据可以正常加载。 ViewPager2 + SmartRefreshView + Multitype使用就会出现重复加载的问题,严重时会出现死循环不停加载。

SmartRefreshView + Multitype 使用 image image

ViewPager2 + SmartRefreshView + Multitype使用 image image

graysonwu2018 avatar Mar 09 '21 12:03 graysonwu2018

感谢反馈,但看起来你使用的这个下拉刷新组件并非谷歌官方提供的,因此我们无法了解它做了什么错误的事情,你能否提供最小可复现程序工程,或者根据你的 debug 发起 PR?


From: grayson [email protected] Sent: Tuesday, March 9, 2021 8:37:56 PM To: drakeet/MultiType [email protected] Cc: Subscribed [email protected] Subject: [drakeet/MultiType] 嵌套使用,ItemViewDelegate对象出现多次重复加载,一直死循环。 (#316)

SmartRefreshView + Multitype使用没有问题,数据可以正常加载。 ViewPager2 + Multitype使用没有问题,数据可以正常加载。 ViewPager2 + SmartRefreshView + Multitype使用就会出现重复加载的问题,严重时会出现死循环不停加载。

SmartRefreshView + Multitype 使用 [image]https://user-images.githubusercontent.com/19201565/110471316-f5eac700-8116-11eb-81ca-6821d7e638e2.png [image]https://user-images.githubusercontent.com/19201565/110471404-0e5ae180-8117-11eb-808f-c6522ff60f22.png

ViewPager2 + SmartRefreshView + Multitype使用 [image]https://user-images.githubusercontent.com/19201565/110471503-2af71980-8117-11eb-8563-5ae2978e0e54.png [image]https://user-images.githubusercontent.com/19201565/110471541-35b1ae80-8117-11eb-9d5e-944279d7a358.png

― You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHubhttps://github.com/drakeet/MultiType/issues/316, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ABHZABTDX3N6BMGQBG2HSKLTCYJCJANCNFSM4Y3QKHHA.

drakeet avatar Mar 10 '21 02:03 drakeet

感谢反馈,但看起来你使用的这个下拉刷新组件并非谷歌官方提供的,因此我们无法了解它做了什么错误的事情,你能否提供最小可复现程序工程,或者根据你的 debug 发起 PR? ________________________________ From: grayson [email protected] Sent: Tuesday, March 9, 2021 8:37:56 PM To: drakeet/MultiType [email protected] Cc: Subscribed [email protected] Subject: [drakeet/MultiType] 嵌套使用,ItemViewDelegate对象出现多次重复加载,一直死循环。 (#316) SmartRefreshView + Multitype使用没有问题,数据可以正常加载。 ViewPager2 + Multitype使用没有问题,数据可以正常加载。 ViewPager2 + SmartRefreshView + Multitype使用就会出现重复加载的问题,严重时会出现死循环不停加载。 SmartRefreshView + Multitype 使用 [image]https://user-images.githubusercontent.com/19201565/110471316-f5eac700-8116-11eb-81ca-6821d7e638e2.png [image]https://user-images.githubusercontent.com/19201565/110471404-0e5ae180-8117-11eb-808f-c6522ff60f22.png ViewPager2 + SmartRefreshView + Multitype使用 [image]https://user-images.githubusercontent.com/19201565/110471503-2af71980-8117-11eb-8563-5ae2978e0e54.png [image]https://user-images.githubusercontent.com/19201565/110471541-35b1ae80-8117-11eb-9d5e-944279d7a358.png ― You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub<#316>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ABHZABTDX3N6BMGQBG2HSKLTCYJCJANCNFSM4Y3QKHHA.

最小可复现程序工程已上传到Github。 链接地址:https://github.com/YunChe-Linghit/MultitypeFix 麻烦看看到底出什么问题了。

YunChe-Linghit avatar Mar 10 '21 08:03 YunChe-Linghit

排查出问题了吗?是因为什么问题导致的呢?

YunChe-Linghit avatar Mar 18 '21 03:03 YunChe-Linghit

@YunChe-Linghit 这个 issue 优先级不是很高,它大概率是你使用的另外的库的问题,因为 MultiType 理论上来说是很纯粹的,所以目前不会很紧急地进行处理,请再等等或尝试自行寻找原因和发起 PR。

drakeet avatar Mar 18 '21 05:03 drakeet

我尝试验证您提供的方案,验证问题是否解决,结论是没有解决。使用您的方案,RecyclerView会导致测量大小不准确的问题,拉动RecyclerView到底部,出现自动定位到前面位置的问题。

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2021年4月7日(星期三) 下午4:47 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [drakeet/MultiType] 嵌套使用,ItemViewDelegate对象出现多次重复加载,一直死循环。 (#316)

我研究了一下,找到罪魁祸首了,RecyclerView.onMeasure()有这么一段判断: final int widthMode = MeasureSpec.getMode(widthSpec); final int heightMode = MeasureSpec.getMode(heightSpec); final boolean measureSpecModeIsExactly = widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY; if (measureSpecModeIsExactly || mAdapter == null) { return; }

在你的嵌套情况下不知道是哪个父View传给了Recyclerview的高度标记是AT_MOST(上限),导致一直在重新计算; 我尝试重写了你的FastListView.onMeasure解决了: override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val heightMode = MeasureSpec.getMode(heightMeasureSpec) if (heightMode != MeasureSpec.EXACTLY) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec( MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY )) } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec) } }

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

graysonwu2018 avatar Apr 07 '21 09:04 graysonwu2018

刚刚我没测试完全,除了标识,高度也必须和之前一样;两次嵌套的情况下第一次拿到的事最外层的高度,导致我刚刚的方法不可用,我就删掉了,我改成了下面这样应该可以解决,但是需要再优化:

private var saveHeight = 0

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    if (saveHeight > 0) {
        super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(
            saveHeight,
            MeasureSpec.EXACTLY
        ))
        return
    }

    val heightMode = MeasureSpec.getMode(heightMeasureSpec)
    if (heightMode == MeasureSpec.EXACTLY) {
        saveHeight = MeasureSpec.getSize(heightMeasureSpec)
    }

    super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}

qdsfdhvh avatar Apr 07 '21 09:04 qdsfdhvh

onMeasure

确实是不停的onMeasure导致的,我最近又发现了,版本是4.2.0版本,只是在ConstraintLayout布局中添加,并且有用到ViewPager2。

graysonwu2018 avatar Aug 26 '22 10:08 graysonwu2018