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

Posted

技术标签:

【中文标题】如何从其适配器中更改回收视图的项目位置?【英文标题】:How to change item position of a recycle view from within its adapter? 【发布时间】:2021-10-15 21:07:24 【问题描述】:

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

我想达到什么目标?

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

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

如何在适配器内从 I 项移动到另一个项?

【问题讨论】:

嘿,您需要将当前单击的项目位置和您的数组列表数据作为参数传递给底页对话框,当单击“下一步”时,如果需要,请关闭当前的底页,并在单击列表项时执行相同的操作,表示打开底部表对话框并传递位置+ 1,以便显示下一个底部表项! 【参考方案1】:

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

例如,您可以在底部工作表中创建一个方法来更新底部工作表 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()
    

【讨论】:

【参考方案2】:

RecyclerView 有几个方便的方法,scrollToPositionsmoothScrollToPosition(后者需要一些设置,查看链接)。您可以使用它们来更改当前显示的项目。

这需要对RecyclerView 的引用,而您的Adapter 没有(或者至少它没有公开它)。 There's a callback 当 on 开始观察适配器时。因此,您可以在获取该引用时存储它(但在发生等效的 onDetached 回调时不要保留它)


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

有很多方法可以协调它,但如果你能将这些功能分开,它会让事情变得更整洁。当一个具有特定工作(显示项目和处理点击)的事情开始做其他事情(与其他 UI 组件打交道,处理 他们 所做的事情)时,它可能会开始变得复杂。由您决定,但值得考虑!

【讨论】:

【参考方案3】:

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

    在适配器中创建了一个接口 在启动适配器的片段中实现了该接口 当用户按下下一个或上一个按钮时,我关闭当前底部工作表,然后在界面中调用该函数并将其传递给下一个或上一个项目的位置 当在片段中调用实现的函数时,首先我将列表移动到该位置,然后我在该位置获取项目,第三次调用在单击该项目时执行,并显示该项目的底部工作表

这是在片段中调用的乐趣

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())
    

【讨论】:

以上是关于如何从其适配器中更改回收视图的项目位置?的主要内容,如果未能解决你的问题,请参考以下文章

在顶部添加新项目后,回收器视图未滚动到顶部,因为尚未发生对列表适配器的更改

如何找出分页数据适配器中的第一项已更改

如何根据位置从“回收”视图中删除Firebase数据库密钥

在复选框状态更改时从回收器视图适配器更新 sqlite 数据库

添加新列表时,回收站视图开始自动滚动

回收网格中的错误。无需随机点击即可更改UI