Android RecyclerView使用Kotlin处理数据:修改后的行切换索引
我正在Kotlin编写我的第一个Android项目,并与recyclerView很难。
MutableList <String>用作我的适配器的数据源,并具有编辑模式和正常模式。
onCreateViewHolder()用内部的editText膨胀一个视图,然后创建一个视图持有者来保存这个视图。
ViewHolder有一个包含我的逻辑的函数bindSkill()。
onBindViewHolder()调用viewHolder.bindSkill()
bindSkill()具有在EditMode和Normal Mode之间转换的逻辑。
当我将EditMode设置为true时,应该发生三件事情:
- EditText字段应该设置为.isEnable = true(允许用户编辑文本字段)
- 应该将EditText字段的背景设置为.background = R.drawable.m_gray_border(向用户显示文本字段)
- 从mStringMutableList加载文本(如果需要?)
当再次按下时,倒过程应该运行(有一些修改:
- EditText字段应该设置为.isEnable = false
- EditText字段应该将背景设置为.background = null(隐藏文本字段边框)
- 保存来自mStringMutableList的文本(如果需要?)
- 使用•%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 } } } }