我有一个 RecyclerView,里面有这样的项目:
我使用 ItemTouchHelper.SimpleCallback
来监听滑动,并使用 onChildDraw() 在项目被滑动时绘制 Canvas :
再轻扫一下:
我的问题:
我想在项目列表中的第一个项目上模拟滑动(在运行时);我需要第一个项目在其 X 轴上(或多或少)-100 像素,然后返回到原始位置。如何实现?
最佳答案
我创建了一些实用方法以备不时之需
import android.animation.ValueAnimator
import android.os.SystemClock
import android.view.MotionEvent
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
/**
* @author Oleh Haidaienko
* @since 29.07.2020
*/
object SwipeUtils {
/**
* Programmatically swipe RecyclerView item
* @param recyclerView RecyclerView which item will be swiped
* @param index Position of item
* @param distance Swipe distance
* @param direction Swipe direction, can be [ItemTouchHelper.START] or [ItemTouchHelper.END]
* @param time Animation time in milliseconds
*/
fun swipeRecyclerViewItem(
recyclerView: RecyclerView,
index: Int,
distance: Int,
direction: Int,
time: Long
) {
val childView = recyclerView.getChildAt(index) ?: return
val x = childView.width / 2F
val viewLocation = IntArray(2)
childView.getLocationInWindow(viewLocation)
val y = (viewLocation[1] + childView.height) / 2F
val downTime = SystemClock.uptimeMillis()
recyclerView.dispatchTouchEvent(
MotionEvent.obtain(
downTime,
downTime,
MotionEvent.ACTION_DOWN,
x,
y,
0
)
)
ValueAnimator.ofInt(0, distance).apply {
duration = time
addUpdateListener {
val dX = it.animatedValue as Int
val mX = when (direction) {
ItemTouchHelper.END -> x + dX
ItemTouchHelper.START -> x - dX
else -> 0F
}
recyclerView.dispatchTouchEvent(
MotionEvent.obtain(
downTime,
SystemClock.uptimeMillis(),
MotionEvent.ACTION_MOVE,
mX,
y,
0
)
)
}
}.start()
}
}
关于android - 如何以编程方式(在运行时)滑动一行 RecyclerView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34401166/