提供一个操做便捷、多功能的Recyclerview适配器

原创文章,转载请联系做者java

前言

这是Kotlin实践日记的第一章,使用Kotlin构建一个,使用方便、多功能的Recyclerview适配器——AcrobatAdapter
git

AcrobatAdapter让开发者专一于Item的配置,包括Item的UI和数据显示,以及单击、双击、长按事件【且不会影响子View的事件传递】。并且不只仅是单Item Style列表,仍是多Item Style列表,AcrobatAdapter的使用都是同样方便简单。github

AcrobatAdapter的设计灵感来自于夜叉,个人函数名称也沿用夜叉的函数名,由于itemDSL这个名称是在太贴切了。夜叉这个项目是针对Recyclerview总体来构建,推荐小可爱们去看看。bash

GitHub连接放在文章底部哦。
下面将展现使用文档。ide

使用文档

####普通列表函数

val acrobatAdapter = AcrobatAdapter<Int> {
          itemDSL {
              resId(R.layout.item_test)
              showItem { d, pos, view ->
                  view.item_tv.text = "数据Item" + d
              }
          }
       }.setData(数据源)
recycler_view.adapter = acrobatAdapter
复制代码

哒哒,以上代码就成功构建了一个列表
resId()函数绑定Item的布局ID
showItem函数内,渲染数据,d表示此项Item对应数据,会根据适配器泛型自动转换。pos为Item的position,view是Item的布局View。并且Kotlin支持使用Id表明控件,不再用写findViewById啦!
最后,适配器的setData方法内置了DiffUtils,会对比新旧数据,这样在数据刷新时Recyclerview会有默认动画展现。让交互更加平滑。布局

若是开发者在项目中,有好几个界面的Item彻底同样,那岂不是还要写几套代码?彻底不用担忧,Item也支持复用。

首先Item相关类,继承AcrobatItem性能

class Test : AcrobatItem<Int>() {
    override fun showItem(d: Int, pos: Int, view: View) {
        view.item_tv.text = "共用Item" + d
    }
    override fun getResId(): Int = R.layout.item_test
}
复制代码

在适配器中:动画

val acrobatAdapter = AcrobatAdapter<Int> {
            item { 
                Test()
            }
        }.setData(数据源)
        recycler_view.adapter = acrobatAdapter
复制代码

让你的Item继承AcrobatItem便可。这样再多的界面复用Item也彻底可行,但要注意的一点是:Item的数据类型必须一致。ui

多Item样式能够咩?固然能够啦!

多item样式的话,写多个ItemDSL便可!每个ItemDSL就表明一种独有的Item样式。同理,每调用一次item,也就多一种Item样式。

val acrobatAdapter = AcrobatAdapter<Int> {
       itemDSL {
            resId(R.layout.item_test)
            showItem { d, pos, view ->
                 view.item_tv.text = "数据Item: " + d
              }
              isMeetData { d, pos -> pos == 1 }
           }
        itemDSL {
             resId(R.layout.item_test1)
             showItem { d, pos, view ->
                  view.item_tv.text = "cece: " + d
              }
              isMeetData { d, pos -> pos != 1 }
           }
        }.setData(数据源)
  recycler_view.adapter = acrobatAdapter
复制代码

isMeetData函数两个参数为数据和position。用这两个参数来判断此Item在哪一个位置、什么条件展现。譬如示例代码,position为1时是一个样式,不为1时是另外一种样式。但要注意,全部的Item的isMeetData的条件都是互斥的噢。不然会抛出异常。

嗯……Recyclerview没有默认的Item点击事件怎么办?没问题,AcrobatAdapter替你搞定。每一个Item不但有单击click,还附带了双击DoubleTap和长按LongPress事件。并且彻底不会影响Item布局View内部childView的事件。

  • 每种Item均可以绑定本身独有的三个事件
val acrobatAdapter = AcrobatAdapter<Int> {
         itemDSL {
             resId(R.layout.item_test)
             showItem { d, pos, view ->
                 view.item_tv.text = "数据Item: " + d
             }
             onClick { 
                 toastS("单击")
             }
             onDoubleTap { 
                 toastS("双击")
             }
             
             longPress { 
                 toastS("长按")
             }
         }
         
         itemDSL {
             resId(R.layout.item_test1)
             showItem { d, pos, view ->
                 view.item_tv1.text = "另外一种样式" + d
             }
             isMeetData { d, pos -> pos == 1 }
             
             onClick { 
                 toastS("单击另外一种Item")
             }

             onDoubleTap {
                 toastS("双击另外一种Item")
             }

             longPress {
                 toastS("长按另外一种Item")
             }
         }         
       }.setData(数据源)
复制代码

三个事件都是单独绑定Item的样式的!当使用多Item样式列表时,不再用在click事件中,写不少的条件判断了!

AcrobatAdapter不但支持Item绑定事件,也支持Adapter外部绑定事件。但这样就须要开发者,在外部事件里区分多Item样式了。

  • 适配器持有Item事件,使用AcrobarAdapterbindEvent()函数
val acrobatAdapter = AcrobatAdapter<Int> {
         itemDSL {
             resId(R.layout.item_test)
             showItem { d, pos, view ->
                 view.item_tv.text = "数据Item: " + d
             }
             isMeetData { d, pos -> pos != 1 }
         }
        }.setData(data).bindEvent { 
            onClick { 
                toastS("外部单击")
            }
            
            onDoubleTap { 
                toastS("外部双击")
            }
            
            longPress { 
                toastS("外部长按")
            }
        }
复制代码

还有几个使用的小Tip

  • ItemDSl的onViewCreated(parent,view)函数
val acrobatAdapter = AcrobatAdapter<Int> {
        itemDSL {
            resId(R.layout.item_test)
            showItem { d, pos, view ->
                view.item_tv.text = "数据Item: " + d
            }
            
            onViewCreate { parent, view -> 
                做一些和数据无关的UI操做,譬如view设置为圆形
                或者EditText的addTextChangedListener
            }
        }
      }
复制代码

showItem()函数是绑定在适配器的onBingViewHolder函数里的,触发会比较频繁。若是在showItem内作一些UI操做,会比较浪费性能.
onViewCreated函数是绑定在适配器的onCreateViewHolder函数内

  • 刷新单个Item布局

Recyclerview若是须要刷新Item的话,不建议使用notifyItemChanged(int position)方法,由于这个方法会刷新整个Item的视图。在视觉上的直观体现就是,Item会闪烁。因此建议使用以下方法刷新Item:

notifyItemChanged(int position, Object payload)
复制代码

使用上面这个方法,不会重绘整个View的视图。

val acrobatAdapter = AcrobatAdapter<Int> {
       itemDSL {
           resId(R.layout.item_test)
           showItem { d, pos, view ->
               view.item_tv.text = "数据Item: " + d
           }
           showItemPayload { d, pos, view, payloads -> 
            刷新Item的某个特定的ChildView。
            譬如在某个Item刷新进度条。下面为伪代码
            view.progreess_bar.setProgress(100%)        
           }
        }
     }
复制代码

下面简单作一下效果展现:

#####使用notifyItemChanged(int position)showItem刷新布局

#####使用notifyItemChanged(int position, Object payload)showItemPayload刷新布局

效果对比,一目了然。

结语

AcrobatAdapter,连接在此,你们要是喜欢的话不妨点个star吧。
Kotlin已成为Android开发的官方语言,无论工做上用获得用不到,你们了解一二仍是有必要的。毕竟这个时代变化的太快了。
以上

相关文章
相关标签/搜索