如何从其适配器中更改回收视图的项目位置?

How to change item position of a recycle view from within its adapter?

是否可以从适配器本身更改项目?

我想达到什么目标?

我创建了一个简单的回收器视图,它有一个简单的列表项,但是当用户单击该项目时,会显示底部 sheet 对话框(底部 sheet 正在创建适配器本身,因此每个项目都不同)底部 sheet 对话框有一个后退和下一步按钮,可以让用户在项目视图中来回移动

当用户点击项目时 -> 显示底部 sheet 对话框 -> 如果他按下下一步,我必须显示下一个项目,其底部 sheet 打开。

如何在适配器中从一个项目移动到另一个项目?

您可以将位置和列表项作为 ArrayList 传递到底部 sheet 并在下一个和上一个按钮上更新 UI。

例如,您可以在底部 sheet 中创建一个方法来更新底部 sheet UI:

    var listItem = ArrayList<Objects>()
    var position = 0
    
    private fun updateUi() {
        val item = listItem[position]
        ///update ui with item
    }

点击下一步按钮:

  position += 1
    if (position == listItem.size)
    {
        // end of list
    } else
    {
        updateUi()
    }

然后点击上一个按钮:

    position -= 1
    if (position == -1)
    {
        // end of list
    } else
    {
        updateUi()
    }

RecyclerView 有几个方便的方法,scrollToPosition and smoothScrollToPosition(后者需要一些设置,检查 link)。您可以使用这些来更改当前显示的项目。

虽然这需要参考 RecyclerView,但您的 Adapter 没有(或者至少,它没有公开)。 There's a callback when on 开始观察适配器。所以当你得到它时你可以存储它(但是当等效的 onDetached 回调发生时不要保留它)


就我个人而言,我想将所有这些东西分开,让它们由包含的片段或其他一些组件协调。因此,不是一个组件(适配器)管理其他组件正在做和显示的事情,它只是调用一个函数说“嘿,这个项目被点击了”,结果发生的事情是它关注的 none。

有很多方法可以协调它,但如果您可以分离该功能,它会使事情变得更整洁。当一个具有特定工作(显示项目和处理点击)的东西开始做其他事情(与其他 UI 组件混淆,处理 他们 做的事情)它会开始变得复杂.取决于你,但值得考虑!

感谢所有分享想法的人。 这是我最后做的

  1. 在适配器中创建了一个接口
  2. 在启动适配器的片段中实现了该接口
  3. 当用户按下下一个或上一个按钮时,我关闭当前底部 sheet 然后我调用界面中的函数并将它传递给下一个或上一个项目的位置
  4. 当实现的函数在片段中被调用时,首先我将列表移动到那个位置,然后我得到那个位置上的项目,第三次调用在点击那个项目时执行,它显示在底部 sheet该项目

这是片段中调用的乐趣

override fun onAddIconClick(position: Int) {
    surveyBinding.surveyRecV.scrollToPosition(position)
    val v: View? = surveyBinding.surveyRecV.layoutManager?.findViewByPosition(position)
    if(v != null) {
        v.findViewById<ImageView>(R.id.viewAddIcon).performClick()
        val temp = v.findViewById<TextView>(R.id.viewMainTitle)
        Log.i("here22" , temp.text.toString())
    }
}