美文网首页Android 知识Android UI特效实现Android学习
RecyclerView 梳理:点击&长按事件、分割线、

RecyclerView 梳理:点击&长按事件、分割线、

作者: OCNYang | 来源:发表于2017-08-03 11:38 被阅读4212次

    先对曾经点喜欢或者收藏这篇文章的朋友说声抱歉,因部分原因个人决定在简书停更并转移驻扎到其他平台。本想删除账号,可不忍已经点喜欢和收藏的朋友再进入此文章看到 “404” 的页面。所以在下面附上这篇文章转移的新地址。

    《RecyclerView 梳理:点击&长按事件、分割线、拖曳排序、滑动删除》 新地址如下:
    掘金: https://juejin.im/post/5a320ffcf265da43200342a3
    CSDN: http://blog.csdn.net/shedoor/article/details/77326167

    同时你也可以到我的个人博客网站查看:www.ocnyang.com

    相关文章

      网友评论

      • 薛之涛:还有个疑问,对item监听可以通过addOnItemTouchListener(),那我要是想具体item里的imageview呢?
      • TimeJ:写的不错!
      • 逆夏时光:你好!我按照你的源码,实现了拖拽,但是,拖拽后的item它的分割线没了,怎么破,检查了,也没找到问题。
        efb74877b9d4:大神,想了解下,你这个demo里面的svg图是如何转换成矢量图的,还带有渐变色,我看官网说as不支持,但是你的可以啊:flushed:
        逆夏时光:谢谢,我在查一查
        OCNYang:@逆夏时光 文章结尾有Github上的源代码地址,和自己的代码结合看看有什么不对。我不知道你的代码,只听你的描述我也无法知道问题在哪的。(这里我只是感觉,如果是拖曳后分割线没了,可能是分割线绘制的代码有问题)
      • 瓶盖子:大神,有个问题想咨询下,如果想固定的不是第一项,是中间的某一项要怎么办?直接移动到那一项会不移动,但是你要移动到周围的item,这个固定的item就会去补空,不知道你能听懂我说的啥不:sweat_smile:
        OCNYang:@瓶盖子 参考上文中倒数第一代码段onMove()的方法。
        当fromPosition 或者 toPosition 是这个item时就返回false;(如果是设置的tag,通过tag判断)
        瓶盖子:@OCNYang 直接设置中间一项固定是可以的,但是往不固定项移动的时候这个固定项会因为补空而移动
        OCNYang:@瓶盖子 其实要固定哪一个item,只要能标志出这个item就行了。目前固定某个item是通过下标,也就是通过下标这个标示。如果你想标示中间某项,同时后期能够位置移动。我个人感觉可以这样:第一次初始化数据,通过下标标示这个item,同时给这个item设置一个tag标示,以后item能否被长按拖曳通过这个tag来辨别就好了。
      • CnPeng:有个地方没大明白,就是实现拖拽替换数据的时候,为什么要使用遍历呢?
        OCNYang:@CnPeng 这个你们可以在 网格布局 中测试一下试试,应该就能显示出来差别了。其实仔细看文章中网格布局的拖曳动画,应该就能想明白了。确切说就是:在拖曳交换位置的时候,被交换的两个item,并不是单单的这两个item进行交换,而是(从from的item到to的item)整体向后移动;因为线性布局中,总是相邻的两个item进行交换,所以按上面写直接交换位置,不会出现问题。
        CnPeng:@紫木冰枫 我也觉得应该这么写,但是看作者文中的代码使用了一次遍历,然后传入的是 i , i+1 和 i , i-1 ,没想明白为啥
        紫木冰枫:我是这样写的:

        Collections.swap(datas, fromPosition, toPosition)

        adapter.notifyItemMoved(fromPosition, toPosition)
      • CnPeng:其实谷歌在API 25 已经推出了 适合 LinearLayoutManager 使用的 DividerItemDecoration , 也就是说,如果需要实现 ListView 的那种列表界面,可以直接使用 DividerItemDecoration 作为分割线
      • 589cc502115c:你好,想请问下设置点击事件直接在view holder里面设置监听器不就简单多了么,还是说具体有什么性能差别呢
        589cc502115c:@OCNYang :+1:
        徐三月:@OCNYang 很赞同大神的说法:+1: 搬砖就应该越搬越稳:yum:
        OCNYang:@况国华 在 view holder 设置监听事件也是可以的,但是条目整体事件我们还是放在Activity中直接设置比较好,view holder 可以设置一些条目子控件的事件(条目的子控件事件我们同时推荐通过设置回调监听还是放到Activity中设置、处理) 至于,为什么我们推荐把事件放到Activity中设置以及处理,一般我们都建议把改变界面的逻辑都放到Activity中。如果你的条目事件逻辑只是一个跳转,当然你在viewholder感觉很方便(毕竟viewholder有Activity的引用);设想一下,如果一个Activity中不单是一个列表,还有其他控件,如果你的条目事件逻辑是要点击条目改变其他控件的状态,你放到viewholder中是不是不合适了。 同时别人阅读你的代码时,如果你的事件放的七零八落的,人家很难找到事件的逻辑在哪,有时会感觉很莫名。 当然,放在viewholder里也是完全可以的,只是我们希望我们的条理更清晰,方式更优雅。
      • 潇风寒月:太棒了,感谢楼主分享.
      • 有点健忘:一直想学习下拖拽,懒啊,今天终于静下心来学习楼主发布的内容,收获满满的,非常感谢。
        另外大概瞅了下源码
        isLongPressDragEnabled被调用之前还有个方法的
        if (!mCallback.hasDragFlag(mRecyclerView, vh)) {
        return;
        }
        这玩意被调用了,点了下看他最终还是判断movementsflag的,所以如果不想让第一个控件拖拽,也可以简单的在getMovementFlags方法里,根据viewholder获取position,如果等于0直接返回0,也能实现禁止第一个拖拽了。不知道对不对:cry:
      • OCNYang:fooldos
      • 3bc782411433:赞~谢谢分享~
      • 小新哥的大梦想::+1: 写的不错,顶一个

      本文标题:RecyclerView 梳理:点击&长按事件、分割线、

      本文链接:https://www.haomeiwen.com/subject/eutplxtx.html