V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pcatzj
V2EX  ›  Android

RecyclerView 又遇到问题啦!所以又来请教!

  •  
  •   pcatzj · 2016-11-19 15:58:58 +08:00 · 5859 次点击
    这是一个创建于 2716 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在用一个 RecyclerView 做菜单,里面有 CheckBox ,可以选择,菜单有重置功能,点击重置按钮后所有已 checked 的 CheckBox 会把状态重置,但是现在出现了一个问题,就是我把菜单往下滑动后, 上面会有一部分菜单被隐藏,这时我遍历 RecyclerView 的 item 就无法遍历到这部分,所以导致这部分菜单无法重置,请问有什么好的办法?

    第 1 条附言  ·  2016-11-19 22:35:06 +08:00
    不好意思,这个帖子发重了, https://www.v2ex.com/t/321690#reply7 这里是原来的,发的时候提示我主题已存在,所以发了这个,现在看来是网络问题。问题已解决,谢谢大家的热心回复!
    13 条回复    2016-11-21 17:04:54 +08:00
    ivechan
        1
    ivechan  
       2016-11-19 16:18:20 +08:00
    你更改状态不是通过 RecyclerView.Adapter ? 而是直接对 checkbox 操作吗?
    ivechan
        2
    ivechan  
       2016-11-19 16:24:39 +08:00
    adapter 提供个重置 checkbox 接口, onBindViewHolder 方法里判断 checkbox 状态就行了吧
    kassadin
        3
    kassadin  
       2016-11-19 16:27:35 +08:00
    不要用 onCheck,设置 checkListener 为 null, 用 onClick
    Guaidaodl
        4
    Guaidaodl  
       2016-11-19 16:31:20 +08:00
    Adapter 用记录每一个 Checkbox 状态, 然后点击重置的时候更新 Adapter 里的数据, 然后 notify 就可以了.
    pcatzj
        5
    pcatzj  
    OP
       2016-11-19 22:34:48 +08:00
    不好意思,这个帖子发重了, https://www.v2ex.com/t/321690#reply7 这里是原来的,发的时候提示我主题已存在,所以发了这个,现在看来是网络问题。问题已解决,谢谢大家的热心回复!
    pcatzj
        6
    pcatzj  
    OP
       2016-11-19 22:40:29 +08:00
    @ivechan
    @kassadin
    原来是这么做的,但是发现这么做不可行,因为不在可视范围内的 item 会被 recycle ,所以操作会产生问题。这篇帖子是发重了的,后来这个问题已经在前一篇帖子里得到答复并解决,就是在 dataBean 里不仅存储需要展示的数据,还存储了 CheckBox 状态的变量,每次通过更改 dataBean ,然后 notifyDataSetChanged 来控制布局的刷新和重置,其实这本来是一个 RecyclerView 常规的思想,甚至 ListView 也是这套想法,但是却被我跑偏了,感谢大家的不吝赐教,涨姿势了!
    pcatzj
        7
    pcatzj  
    OP
       2016-11-19 22:42:02 +08:00
    @Guaidaodl
    对,后来就是通过这个方法解决了,但是之前还是想法太狭隘,因为要重置 checkbox 的状态,就自然而然的想到了遍历 item 对 checkbox 进行操作,结果导致了一个大 bug ,感谢您的不吝赐教!
    iAcn
        8
    iAcn  
       2016-11-19 22:45:01 +08:00 via Android
    以前碰见过这种问题,当时是 RecyclerView.setItemViewCacheSize(0) 把缓存个数设置成可见 Item + 0 个,这样保证每个 Item 滑动都会走 onBindViewHolder(),然后再从这里边设置。不知道适不适用你的情况 😂
    pcatzj
        9
    pcatzj  
    OP
       2016-11-19 23:03:51 +08:00
    @iAcn 这个方法我倒真不知道,待我去试一试!
    iAcn
        10
    iAcn  
       2016-11-19 23:09:04 +08:00 via Android
    @pcatzj 我是这样做的,也遍历了可见 Item ,因为我的 Item 有个动画,直接 notifyDataSetChange() 就显示不出动画来了
    Guaidaodl
        11
    Guaidaodl  
       2016-11-20 10:40:21 +08:00
    @pcatzj 没事, 刚开始的时候不熟悉很容易遇到一些问题, 大家都是这样过来的.
    pcatzj
        12
    pcatzj  
    OP
       2016-11-21 15:19:31 +08:00
    @iAcn 试了一下果然是可以的,之前还在想为什么 item 不可见了没有被回收,没有走 bind ,原来是这个原因。记下了,万一以后有不得已直接对 view 操作的时候,这个方法就用得上了,感谢!
    iAcn
        13
    iAcn  
       2016-11-21 17:04:54 +08:00 via Android
    @pcatzj 没事的,不用谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2677 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:09 · PVG 19:09 · LAX 04:09 · JFK 07:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.