Android RecyclerView使用Kotlin处理数据:修改后的行切换索引

我正在Kotlin编写我的第一个Android项目,并与recyclerView很难。

MutableList <String>用作我的适配器的数据源,并具有编辑模式和正常模式。

onCreateViewHolder()用内部的editText膨胀一个视图,然后创建一个视图持有者来保存这个视图。

ViewHolder有一个包含我的逻辑的函数bindSkill()。

onBindViewHolder()调用viewHolder.bindSkill()

bindSkill()具有在EditMode和Normal Mode之间转换的逻辑。

当我将EditMode设置为true时,应该发生三件事情:

  1. EditText字段应该设置为.isEnable = true(允许用户编辑文本字段)
  2. 应该将EditText字段的背景设置为.background = R.drawable.m_gray_border(向用户显示文本字段)
  3. 从mStringMutableList加载文本(如果需要?)

当再次按下时,倒过程应该运行(有一些修改:

  1. EditText字段应该设置为.isEnable = false
  2. EditText字段应该将背景设置为.background = null(隐藏文本字段边框)
  3. 保存来自mStringMutableList的文本(如果需要?)
  4. 使用•%1 $ s格式化字符串以制作项目符号列表

问题

当用我的数据加载适配器时,它将被编辑文本字段中的空字符串覆盖。

另外,当我进入编辑模式,并更改文本字段的recycleView行开始切换的地方。 文本按预期更改并存储和格式化,但会移至新索引。

如果你填写所有的文本字段,他们将被颠倒,但是如果你只改变了几个,他们就会随机地改变位置。

这种问题有没有普遍的做法? 它接缝很简单,但我不能弄明白。

任何帮助表示赞赏!

代码

活动:

class ProfileActivity : BaseActivity() { private lateinit var recyclerViewProfile: RecyclerView private lateinit var linearLayoutManager: LinearLayoutManager private lateinit var skillAdapter: SkillListAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_profile) toolBar.rightButton.setOnClickListener { beginEdit() } recyclerViewProfile = findViewById(R.id.recyclerView) linearLayoutManager = LinearLayoutManager(this) recyclerViewProfile.layoutManager = linearLayoutManager skillAdapter = SkillListAdapter(mutableListOf("skill1", "skill2", "skill3", "skill4", "skill5")) recyclerViewProfile.adapter = skillAdapter recyclerViewProfile.itemAnimator = DefaultItemAnimator() } private fun beginEdit() { rightButton.setOnClickListener { doneEditing() } skillAdapter.isEditMode = true toolBar.rightButton.text = getString(R.string.save) skillAdapter.notifyDataSetChanged() } private fun doneEditing() { skillAdapter.isEditMode = false toolBar.rightButton.text = getString(R.string.edit) rightButton.setOnClickListener { beginEdit() } skillAdapter.notifyDataSetChanged() } } 

适配器:

 class SkillListAdapter(private var skills: MutableList<String>) : RecyclerView.Adapter<SkillListAdapter.SkillHolder>() { var isEditMode: Boolean = false override fun onCreateViewHolder(parent: ViewGroup, position: Int): SkillHolder { val inflatedView = parent.inflate(R.layout.recycler_item_row) return SkillHolder(inflatedView) } override fun onBindViewHolder(skillHolder: SkillHolder, position: Int) { if (!isEditMode) { skills[position] = skillHolder.skillName.text.toString() } skillHolder.bindSkill(isEditMode, skills[position]) } override fun getItemCount(): Int = skills.size class SkillHolder(view: View) : RecyclerView.ViewHolder(view) { var skillName = view.recycleSkillEditText!! private var boxes = view.recyclerViewCheckBoxes!! init { skillName.setText("") } fun bindSkill(isEditMode: Boolean, SkillName: String) { if (isEditMode) { //begin editing [EDIT MODE] skillName.setText(SkillName) skillName.isEnabled = true skillName.background = itemView.context.getDrawable(R.drawable.rect_rounded_border_gray) boxes.visibility = View.VISIBLE } else { //done editing [NORMAL MODE] skillName.setText(String.format(itemView.context.getString(R.string.bulletPointFormat), SkillName)) skillName.isEnabled = false skillName.background = null boxes.visibility = View.GONE } } } } 

Interesting Posts