Написание адаптера RecyclerView на Kotlin, адаптируемого к ситуации с пустым списком - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю над динамическим списком c, который просматривается на RecyclerView. Пока что можно добавлять и удалять элементы. Также пользователь может изменить содержимое каждого отдельного элемента через несколько всплывающих окон Windows. Однако класс MyViewHolder стал довольно длинным из-за множества onClickListener с. Поэтому я отнес MyRecyclerViewAdapter класс в отдельный файл от остальной части деятельности. Теперь,

  1. Полезно ли хранить MyViewHolder класс долго со многими прослушивателями щелчков (выполняющими большую часть работы внутри объекта Adapter), или я должен получить соответствующие данные из MyRecyclerViewAdapter каким-то образом и выполните операцию «удалить, добавить, отредактировать текст» внутри раздела onCreate?

  2. Какие самые эффективные, простые и быстрые решения позволяют показать совершенно новый а другой вид когда все элементы удаляются? Я попробовал VISIBLE, GONE решение, но MyAdapter находится в отдельном файле, и я не знаю, как связаться с разделом onCreate для передачи в реальном времени размера динамического списка c.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Ответы:

Вопрос 1: Рекомендация Кита Фана о переносе части logi c внутри onBindViewHolder была весьма полезной.

Вопрос 2: Если вы уже прошли текущий В контексте с основным конструктором отдельного класса (который определен в другом файле), в Kotlin возможно достичь содержимого currentActivity сегментом кода: (context as Activity).

Таким образом, решение и общая структура моего адаптера были такими:

 import ...

 class MyAdapter (var ctx: Context, var list: ArrayList<SomeObject>)
    : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapter.MyViewHolder {
    return MyViewHolder(LayoutInflater.from(ctx).inflate(R.layout.singleListElement, parent,false))
    }

    override fun getItemCount(): Int {
    return list.size
    }

    override fun onBindViewHolder(holder: MyAdapter.MyViewHolder, position: Int) {

    //Do the work here, onClickListeners, if statements etc.
    //...
    list.remove(index)
    if(list.size == 0) {
    (ctx as Activity).findViewById<TextView>(R.id.listEmpty).visibility=View.VISIBLE
       }
    } //Close onBindViewHolder

    inner class MyViewHolder (v: View) : RecyclerView.ViewHolder(v){

      val someView: Textview
      init { someView = v.findViewById(R.id.someViewId) }
    }  
}  

Писать код в это окно нелегко. Когда я нажимаю кнопку Tab, браузер выходит из экрана редактирования и выбирает другую часть этой веб-страницы. Так что код выглядит так. Возможно, лучше скопировать / вставить.

Улучшения и более эффективные решения для пустого списка приветствуются. Спасибо.

0 голосов
/ 13 февраля 2020

1 / если ваши действия касаются взаимодействия с компонентом элемента (добавление, удаление, редактирование, получение содержимого ...) в списке, вы должны поместить эту функцию в Adapter, нажатие на ViewHolder должно указывать только его положение в адаптере. Решение здесь: RecyclerView itemClickListener в Kotlin

2 / зачем использовать VISIBLE, GONE? когда вы удаляете элемент, что означает, что вы удаляете элемент в своем списке данных, поэтому просто перезагрузите представление после этого, адаптер автоматически покажет оставшиеся данные

...