简体   繁体   English

滑动后如何在 RecyclerView 中向后滑动项目

[英]How to swipe back an item in RecyclerView after swipe

After swiping an item in RecyclerView I want it to go back without swiping it back manually.在 RecyclerView 中滑动一个项目后,我希望它返回 go 而无需手动滑动它。

Here is an swipeable item in RecyclerView.这是 RecyclerView 中的一个可滑动项目。
Item in RecyclerView RecyclerView 中的项目

RecyclerView 中的项目

Swiping...滑动...

滑动...

After swipe event I want this item to go back, as if it was swiped not far enough, but event must happen.在滑动事件之后,我希望这个项目回到 go ,好像它被刷得不够远,但事件必须发生。 How can I do this?我怎样才能做到这一点?

After swipe刷卡后

在此处输入图像描述

Here is my SwipeHelper, which keeps background static:这是我的 SwipeHelper,它保留背景 static:

abstract class ProfileSwipeHelper : ItemTouchHelper.SimpleCallback(0,
    ItemTouchHelper.LEFT
) {
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        return true
    }

    override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
        if (viewHolder != null) {
            ItemTouchHelper.Callback.getDefaultUIUtil().onSelected((viewHolder as ProfilesAdapter.ViewHolder).foreground)
        }
    }

    override fun onChildDraw(
        c: Canvas,
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        dX: Float,
        dY: Float,
        actionState: Int,
        isCurrentlyActive: Boolean
    ) {
        getDefaultUIUtil().onDraw(c, recyclerView,
            (viewHolder as ProfilesAdapter.ViewHolder).foreground, dX, dY,
            actionState, isCurrentlyActive)

    }

    override fun onChildDrawOver(
        c: Canvas,
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder?,
        dX: Float,
        dY: Float,
        actionState: Int,
        isCurrentlyActive: Boolean
    ) {
        getDefaultUIUtil().onDrawOver(
            c, recyclerView,
            (viewHolder as ProfilesAdapter.ViewHolder).foreground, dX, dY,
            actionState, isCurrentlyActive)
    }
    
    override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
        getDefaultUIUtil().clearView((viewHolder as ProfilesAdapter.ViewHolder).foreground)
    }

}

And here onSwiped event in main activity, only with Toast:而这里主要活动中的 onSwiped 事件,仅与 Toast 一起使用:

//Main Activity

                val context : Context  = this
        val deleteSwipeHandler1 = object : ProfileSwipeHelper() {
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                Toast.makeText(context, "swiped", Toast.LENGTH_SHORT).show()
            }
        }
        ItemTouchHelper(deleteSwipeHandler1).attachToRecyclerView(rv_profiles)

You can use Multiswipe library.您可以使用Multiswipe库。 Read complete explanations here . 在这里阅读完整的解释。 If you want to use Java read this .如果您想使用 Java 阅读 Below is a concise explanation without using complete options of this library:下面是一个简洁的解释,没有使用这个库的完整选项:

add jitpack and Multiswipe library to your project:将 jitpack 和 Multiswipe 库添加到您的项目中:

in settings.gradle or root build.gradle :settings.gradle或根build.gradle

repositories {
    //...
    maven { url 'https://jitpack.io' }
}

in app's build.gradle :在应用程序的build.gradle

dependencies {
    implementation 'com.github.ygngy:multiswipe:1.2.1'
}

implement MultiSwipe in ViewHolder :ViewHolder MultiSwipe

import androidx.recyclerview.widget.RecyclerView
import android.view.View

import com.github.ygngy.multiswipe.MultiSwipe
import com.github.ygngy.multiswipe.LeftSwipeList
import com.github.ygngy.multiswipe.RightSwipeList

class ViewHolder(private val view: View) : RecyclerView.ViewHolder(view), MultiSwipe {
    var mLeftSwipeList: LeftSwipeList? = null
    var mRightSwipeList: RightSwipeList? = null
     
    // todo other ViewHolder codes...

    fun bind() {
       // Each swipe contains of at least an id and an icon
       val likeSwipe = Swipe(
         context = context, // context used to extract default colors and margins from resources
         id = SWIPE_TO_LIKE_ID, // swipe id will be sent to onSwipeDone when swipe is completed
         activeIcon = getDrawable(R.drawable.ic_like_24)!!, // swipe icon
         activeLabel = getString(R.string.like), // OPTIONAL swipe label
         acceptIcon = getDrawable(R.drawable.ic_like_accept_24)!!,// OPTIONAL icon used when swipe displacement is greater than "accept boundary"
         acceptLabel = getString(R.string.like_accept),// OPTIONAL label used when swipe swipe displacement is greater than "accept boundary"
         inactiveIcon = getDrawable(R.drawable.ic_disabled_like_24)!!// OPTIONAL icon used when this swipe could be next swipe
       )

       // Create other swipes (shareSwipe, copySwipe, ...) in a similar way.

      // If row has left swipes, create left swipe list in the desired order like below: 
      mLeftSwipeList = LeftSwipeList (shareSwipe, copySwipe, cutSwipe)
      // If row has right swipes, create right swipe list in the desired order like below:
      mRightSwipeList = RightSwipeList (likeSwipe, editSwipe, delSwipe)
    }
   
   // Don't recreate swipes or any object here 
   override val leftSwipeList: LeftSwipeList?
                get() = mLeftSwipeList
   // Don't recreate swipes or any object here 
   override val rightSwipeList: RightSwipeList?
                get() = mRightSwipeList
    
    
    // Here handle swipe event and/or return some data to MultiSwipeListener 
    override fun onSwipeDone(swipeId: Int): Any? {
        // Instead you may choose to only return data 
        // from this method to consume event at Activity or Fragment
        when(swipeId) {
            SWIPE_TO_SHARE_ID -> {
                // todo share
            }
            SWIPE_TO_COPY_ID -> {
                // todo copy
            }
            //...
        }
        return MyData()// return any data to Activity or Fragment
    }
 }

attach library to recyclerview at activity or fragment:在活动或片段中将库附加到 recyclerview:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

import com.github.ygngy.multiswipe.MultiSwipeListener
import com.github.ygngy.multiswipe.SwipeDirection
import com.github.ygngy.multiswipe.multiSwiping // importing extension function

class DemoActivity : AppCompatActivity() {
    // todo other activity codes...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        // todo other onCreate codes...

        // attaching Multiswipe to RecycerView
        recyclerView.multiSwiping(
            swipeThreshold = 0.5f, // OPTIONAL, the fraction of view for complete swipe threshold
            object: MultiSwipeListener { // OPTIONAL listener

            // This method is called after onSwipeDone of ViewHolder
            // and data is the returned value of onSwipeDone of ViewHolder
            override fun onSwipeDone(swipeId: Int, data: Any?) {
                // data is the return value of "ViewHolder.onSwipeDone"
                // cast to data you returned from "ViewHolder.onSwipeDone"
                val myData = data as MyData?
                when(swipeId) {
                    SWIPE_TO_SHARE_ID -> shareItem(myData)
                    SWIPE_TO_COPY_ID -> copyItem(myData)
                    //...
                }
            }

            /*** 
              This method will be called when direction changes in each swipe. 
              This method could be used to hide on screen widgets such as FABs. 
              direction may be: 
                 - START (when user opens start side of view), 
                 - END (when user opens end side of view), 
                 - NONE (when swipe is closing without user interaction)
            ***/
            override fun swiping(direction: SwipeDirection, swipeListSize: Int) {
                // here i hide FAB when user is swiping end side actively
                if (direction == SwipeDirection.END) fab.hide() else fab.show()
            }
        })
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM