如何从其适配器中更改回收视图的项目位置?
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 组件混淆,处理 他们 做的事情)它会开始变得复杂.取决于你,但值得考虑!
感谢所有分享想法的人。
这是我最后做的
- 在适配器中创建了一个接口
- 在启动适配器的片段中实现了该接口
- 当用户按下下一个或上一个按钮时,我关闭当前底部 sheet 然后我调用界面中的函数并将它传递给下一个或上一个项目的位置
- 当实现的函数在片段中被调用时,首先我将列表移动到那个位置,然后我得到那个位置上的项目,第三次调用在点击那个项目时执行,它显示在底部 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())
}
}
是否可以从适配器本身更改项目?
我想达到什么目标?
我创建了一个简单的回收器视图,它有一个简单的列表项,但是当用户单击该项目时,会显示底部 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 组件混淆,处理 他们 做的事情)它会开始变得复杂.取决于你,但值得考虑!
感谢所有分享想法的人。 这是我最后做的
- 在适配器中创建了一个接口
- 在启动适配器的片段中实现了该接口
- 当用户按下下一个或上一个按钮时,我关闭当前底部 sheet 然后我调用界面中的函数并将它传递给下一个或上一个项目的位置
- 当实现的函数在片段中被调用时,首先我将列表移动到那个位置,然后我得到那个位置上的项目,第三次调用在点击那个项目时执行,它显示在底部 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())
}
}