RecyclerView行为:特定行的自定义在其他行上重复(科特琳)

Skyrocker

我是Android开发人员的新手,现在正在移植我的iOS应用程序。试图使RecyclerView变得非常复杂,但是有时在notifyDataSetChanged()方法之后,特定行的行为会在另一行上重复。

RecyclerView的第一部分中有三行具有相同的ViewType

它们每个都有TextView和EditText小部件,我在CustomViewHolder类中进行填充。
第一行和第二行应该像往常一样工作:当我在EditText中单击时,键盘将打开。但是第三行EditText的焦点应该启动对话框警报。在重新加载适配器的DataSet之前,一切工作正常。重新加载DataSet之后,第一行的EditText也开始打开对话框警报,而不是正常打开键盘。

自定义行时,似乎缺少了某些东西并以某种方式引用了同一对象。这是我的适配器代码(简体):

class NewRequestsRecyclerAdapter(val context: Context, val parameters:ArrayList<NewRequestsFragment.ParameterCell>,val delegate:NewRequestProtocol?): RecyclerView.Adapter<NewRequestsRecyclerAdapter.CustomViewHolder>() {

enum class RowType {
    Header,Parameter
}

override fun getItemCount(): Int {
    // count logic
}

override fun onCreateViewHolder(parent : ViewGroup, viewType: Int): CustomViewHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val cellForRow = when (RowType.values()[viewType]) {
        RowType.Header -> layoutInflater.inflate(R.layout.cell_header,parent,false)
        RowType.Parameter -> layoutInflater.inflate(R.layout.cell_parameter_new_requests,parent,false)
     }

    return CustomViewHolder(cellForRow, RowType.values()[viewType])
}

override fun getItemViewType(position: Int): Int {
    // Here's ItemViewType logic ...
}

override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
    holder.bindMenu(position)
}

inner class CustomViewHolder(val cellView: View, val type:RowType): RecyclerView.ViewHolder(cellView) {
    fun bindMenu(row:Int) {

        when (type) {
            RowType.Header -> {
                val nameView = cellView.findViewById<TextView>(R.id.headerName)
                // other logic to populate Header views
            }
            RowType.Parameter -> {
                val nameView = cellView.findViewById<TextView>(R.id.paramName)
                val editText = cellView.findViewById<EditText(R.id.paramEditText)
                nameView.text = parameters[row-1].name
                editText.apply {
                    hint = parameters[row-1].placeholder
                    when (parameters[row-1].type) {
                        NewRequestsFragment.PartsCellType.Name -> {
                            setText(delegate?.currentItem?.name)
                        }
                        NewRequestsFragment.PartsCellType.Number -> {
                            setText(delegate?.currentItem?.number)
                        }
                        NewRequestsFragment.PartsCellType.StateType-> {
                            setText(delegate?.currentItem?.state)
                            showSoftInputOnFocus = false
                            setOnFocusChangeListener { view, changed ->
                                if (changed) {
                                    inputType = InputType.TYPE_NULL
                                    delegate?.showStateDialog()
                                }
                            }
                        }
                    }
                }
            }

我知道要解决该问题,我可以通过按钮显示警报,但是我想知道为什么我的代码会导致这种现象。
您能指导我我所缺少的吗?

Cheticamp

RecyclerView一个项目神秘地承担另一项目的属性或行为的这种类型的问题通常是由于未重置视图持有者。

您正在定义视图持有者在创建时的行为,因此,第一次创建所有视图持有者并使其行为适当。当事情发生变化时,视图持有者将被重用,而不是重新创建。结果,事情可能会变得混乱,例如在显示键盘时打开对话框。

若要更正此问题,请在绑定视图绑定器时使其重置为所需的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在科特林使用Java自定义注释

Android,循环如何工作?(科特琳)

Laravel验证:存在其他列条件-自定义验证规则

Swift-如何创建自定义运算符以在其他模块中使用?

Magento 2自定义模块无法在其他用户中访问

为什么我的类的自定义成员变量在其他类中不更新?

Ruby on Rails:仅在存在其他属性时运行自定义验证功能

找不到明确的活动(科特琳)

recyclerView的最后一行是否可以包含与其他项目不同的自定义项目?

自定义UITableview单元格有时会在其他单元格上重叠/重现

在其他行之间添加行

如何使用Retrofit在recyclerView中正确加载更多项目?(科特琳)

在其他属性上测试属性依赖项的自定义验证将返回ArgumentNullException

科特琳协程多次发射

按键列表分组(科特琳)

自定义404页面无法在其他目录上使用

在自定义条件下清除重复的行

不在其自定义委托的其他自定义类中调用自定义委托方法

要在其他地方自定义3.5英寸电源面板?

自定义角度甘特行过滤器

Android:在RecyclerView中自定义一行

如何将Android Studio配置为在其他jetbrain ide附带的自定义jdk上运行?

在其他行正常运行时在特定行上重写

使用自定义逻辑删除重复行

不能在其他项目中使用自定义视图(aar lib)

是否可以在其他自定义方法上调用自定义方法?

如何在其他页面上显示带有自定义字段的模板页面

Visual Studio 自定义构建配置工作机制行为 Debug/Release 还是其他什么?

在其他组件中无法访问自定义 useEffect 钩子