Android:如何在RecyclerView中为每张卡片设置不同的海拔高度?

时间:2018-06-20 16:03:51

标签: android android-layout android-recyclerview recycler-adapter android-cardview

我正在开发一个Android应用程序,在其中我需要具有通过拖放来更改RecyclerView中卡片顺序的功能。到目前为止,我可以通过拖动来移动卡。但是我面临一个问题,就是当我将其下方的卡拖动到该卡下方的卡的后面时,而当我向上移动它时,该卡位于其上方的卡的前面,如图所示。

enter image description here

我希望将要拖动的那张卡片始终放在其他卡片上方。因此,我尝试为正在移动的卡提供额外的仰角,但是结果还是一样。以下是与我的应用程序此部分相关的代码段。 应用的最低SDK为22

卡布局XML文件。 (文件太大,无法在此处显示,因此仅作为概述。压缩视图没有任何高程属性。)

enter image description here

onTouch侦听器的内容。

        moveButton.setOnTouchListener({v: View?, event: MotionEvent? ->
    if (v == null || event == null) return@setOnTouchListener true
    when (event.action){
        MotionEvent.ACTION_UP -> {
            v.performClick()
            pressUP(v,event)
        }
        MotionEvent.ACTION_DOWN -> {
            pressDown(v,event)
        }
        MotionEvent.ACTION_MOVE -> {
            pressMove(v,event)
        }
        else -> {
            null
        }
    }
    return@setOnTouchListener true
})

private fun pressDown(imageButton: View, event: MotionEvent){
    openedLayoutManagerLocal?.closeOpenedLayout()
    fragment.mLayoutManager?.setScrollEnabled(false)
    originalDelta = itemView.y
    _yDelta = itemView.y - event.rawY
    itemView.elevateLayoutLocal.elevation = elevation + 10 // as all layouts are by default elevated by 5
}

private fun pressUP(imageButton: View, event: MotionEvent){
    fragment.mLayoutManager?.setScrollEnabled(true)
    val a = itemView.animate()
            .y(originalDelta)
            .setDuration(100)
    a.setListener(object : Animator.AnimatorListener{
        override fun onAnimationEnd(animation: Animator?) {
            itemView.elevateLayoutLocal.elevation = elevation + 5
        }

        override fun onAnimationStart(animation: Animator?) {

        }

        override fun onAnimationRepeat(animation: Animator?) {

        }

        override fun onAnimationCancel(animation: Animator?) {
            itemView.elevateLayoutLocal.elevation = elevation + 5
        }
    })
    a.start()

}

private fun pressMove(imageButton: View, event: MotionEvent){
    itemView.animate()
            .y(event.rawY + _yDelta)
            .setDuration(0)
            .start()
}

那么我分配高程有什么问题吗? 我也想知道是否还有其他方法可以达到这种效果。 预先谢谢你。

0 个答案:

没有答案