Java 安卓系统中具有四向滑动功能的RecyclerView

Java 安卓系统中具有四向滑动功能的RecyclerView,java,android,android-layout,mvvm,android-recyclerview,Java,Android,Android Layout,Mvvm,Android Recyclerview,如何使用四向滑动创建回收视图?我使用java中的MVVM和Room 这是一个示例: 从您的gif中,我已经实现了一个版本raceCyclerView演示。但同样,您可以实现从发布gif到发布gif的所有功能 这个回收站在干什么 允许向左或向右滑动并显示新面板 点击这个面板可以处理 回收器检测点击和长点击 当滑动小于最大尺寸的一半时,面板将塌陷 向右滑动选择项目,可以选择所选项目的最大数量 可以观察选定的项目 外观: 这是一个很长的答案,所以首先我尝试制作一个简短的版本来解释一种方法。首先,

如何使用四向滑动创建回收视图?我使用java中的MVVM和Room

这是一个示例:


从您的gif中,我已经实现了一个版本
raceCyclerView演示。但同样,您可以实现从发布gif到发布gif的所有功能

这个回收站在干什么

  • 允许向左或向右滑动并显示新面板
  • 点击这个面板可以处理
  • 回收器检测点击和长点击
  • 当滑动小于最大尺寸的一半时,面板将塌陷
  • 向右滑动选择项目,可以选择所选项目的最大数量
  • 可以观察选定的项目
外观:

这是一个很长的答案,所以首先我尝试制作一个简短的版本来解释一种方法。首先,您必须为RecyclerView项创建一个布局。该布局可分为3个部分。主面板
与父面板
宽度匹配,左右两侧面板的宽度
0dp
。为该RecyclerView创建适配器后,您已将
onTouch
侦听器设置为查看。此
onTouch
功能必须检测您何时向左/向右滑动(显示侧面板)或上/下滑动(滚动回收器)。但它也必须检测点击和长点击来正确处理它。检测到左右滑动时,可以更改侧面板的宽度。是一个包含完整代码的GitHub存储库,下面我尝试逐步给出解决方案。(在Kotlin中,但我认为您可以轻松重构此代码)


如何做:

启动项目:

  • 数据库基于。一个名为
    DataView
    实体
    ,包含
    id
    DAO
    具有标准查询,如
    insert
    delete
    clearAll
    getAll
  • 带有ViewModel和ViewModelFactory的MainActivity。ViewModel具有数据库中所有DataView的LiveData。MainActivity布局只有一个回收器和按钮,用于插入新项目
  • 三个图标命名为:
    plus
    delete
    selected
0。activity_main.xml:


1。向RecyclerView和CardView添加渐变依赖项

// RecyclerView
implementation 'androidx.recyclerview:recyclerview:1.1.0'

// CardView
implementation "androidx.cardview:cardview:1.0.0"
2。回收物品的背景。主视图、删除面板和选定面板。(当然,不必是渐变色,但需要3个背景)

colors.xml:

#FFCDD2
#C8E6C9
#E57373
#81C784
gradient_view.xml:


gradient_view_delete.xml:


gradient\u view\u select.xml:


3。为回收项目创建布局。

swipe\u recycler\u view.xml:


它是如何工作的?ConstraintLayout是整个布局的根。它在左边和右边都有两个框架,中间是另一个布局。FrameLayouts width设置为1,因此它们不可见。当有人要刷这个项目,我们可以改变FrameLayouth宽度,使其可见

4。创建RecycleServiceAdapter。我将ListAdapter与DiffUtil一起使用。适配器还需要可以处理单击或滑动的类,因此还需要创建新的类SwipeListener。注释了代码的许多部分,以便更好地理解代码。

导入android.annotation.SuppressLint
导入android.os.Handler
导入android.view.LayoutInflater
导入android.view.MotionEvent
导入android.view.view
导入android.view.ViewGroup
导入androidx.lifecycle.LiveData
导入androidx.lifecycle.MutableLiveData
导入androidx.recyclerview.widget.DiffUtil
导入androidx.recyclerview.widget.ListAdapter
导入androidx.recyclerview.widget.recyclerview
导入com.myniprojects.swiperecycler.R
导入com.myniprojects.swiperecycler.database.DataView
导入com.myniprojects.swiperecycler.databinding.SwipeRecyclerViewBinding
导入kotlin.math.abs
导入kotlin.math.max
导入kotlin.math.min
类SwipeRecyclerAdapter(
专用val swipeListener:swipeListener,面板大小:Int
):ListAdapter(
SwipeDiffCallback()
)
{
伴星
{
const val MAX_SELECT_NUMBER:Int=4//用户可以选择的最大项目数
var PANEL_SIZE=125//delete并选择PANEL width,基数为125,但在构造函数中,我们可以基于DP传递新值,该值将覆盖此值
专用设备
}
//保存回收器中所有选定项目的LiveData
private val_selectedValues:MutableLiveData=MutableLiveData()
val selectedValues:LiveData
get()=\u选择的值
初始化
{
面板尺寸=面板尺寸//
_selectedValues.value=ArrayList()
}
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder
{
返回ViewHolder.from(
父母亲
_选择的值,
swipeListener
)
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int)
{
支架绑定(getItem(位置)!!,swipeListener)
}
类ViewHolder私有构造函数(
私有val绑定:SwipeRecyclerViewBinding,
private val selectedItems:MutableLiveData,
private val swipeListener:swipeListener//listener,用于处理单击等操作。
) :
RecyclerView.ViewHolder(binding.root)、View.OnTouchListener
{
private var xStart=0F//跟踪onTouch事件中的刷卡的变量
私有变量lastY=0F
私有变量yStart=0F
private val handler:handler=handler()//处理程序启用t