Android RecyclerView Обработка данных с использованием 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 } } } } 

    Intereting Posts
    Проблема с расширением метода в скрипте Котлин Использование отражения для передачи и изменения примитива без использования массива Kotlin werid компилирует ошибку, связанную с дженериками и автоматическим типом Как удалить строки в SQLite с несколькими аргументами, использующими Anko? Vert.x chunked отвечает данными из базы данных с использованием BLOB и спящего режима Эффективная комбинация карт и фильтров против stdlibs Использование kotlin с каркасом Mvvmfx Приложение Kotlin cli не работает после обновления к kotlin 1.0.0-beta Плагин IdeaVim от IntelliJ отключает преобразование Java в Kotlin Каково место в иерархии типов типов с возможностью NULL? Как преобразовать java.util.stream.Stream <Something> в kotlin.Sequence <Something> Как связать со статическим членом класса Java в KDoc? permissionsdispatcher и несколько @ NeedsPermission с kotlin Перепишите Java-код в Kotlin, используя функцию Reference, возникает конфликт типов SAM Vert.x. Как создать реальное приложение многопользовательского JVM?