android - 如何以编程方式(在运行时)滑动一行 RecyclerView?

标签 android android-layout android-activity android-animation android-recyclerview

我有一个 RecyclerView,里面有这样的项目:

enter image description here

我使用 ItemTouchHelper.SimpleCallback 来监听滑动,并使用 onChildDraw() 在项目被滑动时绘制 Canvas :

enter image description here

再轻扫一下:

enter image description here

我的问题:

我想在项目列表中的第一个项目上模拟滑动(在运行时);我需要第一个项目在其 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/

相关文章:

android - 如何在gridview中设置图片下方有文字?

java - 如果不从已销毁的 Activity 中移除,监听器是否会造成内存泄漏?

android - 以编程方式获取应用于 Activity 的主题值

android - Android Studio Gradle sync说无法下载gradle-3.1.3.pom

android - 在 Android 模拟器上运行示例语音识别应用程序时出现问题

android - 如何使用 PreferenceFragmentCompat 在首选项之间显示分隔符

android - 在 Appium 中,通过不是 View id 字段的唯一 id 查找 Android View

android - 将两个花车返回到上一个 Activity

java - Android Studio : android. jar 缺少一些类

android - Android 中的完成处理程序