Записи базы данных комнат в RecyclerView

Я хочу показать записи базы данных помещений в RecyclerView. Пока у меня есть скелет комнаты, и я могу показать некоторый фиктивный контент (не из комнаты) в RecyclerView:

введите здесь описание изображения

Однако у меня возникают проблемы с отображением записей БД комнаты вместо фиктивного содержимого. В Arduino ввод-вывод EEPROM раньше был почти однострочным, но в Android Room эта концептуально простая задача кажется сложной и не очень сложной задачей. Это подводит меня к моему первому вопросу:

1) Поскольку в моем случае база данных довольно тонкая и простая, есть ли более простой подход, чем Room, с меньшими затратами и классами?

Что касается подхода Room, я считаю, что я довольно близок. У меня есть трудности с реализацией следующего:

2) Как заменить цикл for в DummyContent init на записи Room-DB (allJumps из ViewModel)?

Вот что я получил до сих пор (я не публиковал ничего ниже ViewModel, такого как репозиторий и DAO, поскольку сейчас это не должно представлять интереса):

DummyItems (фиктивное содержимое должно быть заменено записями в базе данных Room)

object DummyContent {

    // An array of sample (dummy) items.
    val ITEMS: MutableList<DummyItem> = ArrayList()

    // A map of sample (dummy) items, by ID.
    val ITEM_MAP: MutableMap<String, DummyItem> = HashMap()

    private val COUNT = 25

    init {
        // Add some sample items.
        // TO BE REPLACED BY ROOM DB ENTRIES <----------------------------------------------------
        for (i in 1..COUNT) {
            addItem(createDummyItem(i))
        }
    }

    private fun addItem(item: DummyItem) {
        ITEMS.add(item)
        ITEM_MAP.put(item.id, item)
    }

    private fun createDummyItem(position: Int): DummyItem {
        return DummyItem(position.toString(), "Item " + position, makeDetails(position))
    }

    private fun makeDetails(position: Int): String {
        val builder = StringBuilder()
        builder.append("Details about Item: ").append(position)
        for (i in 0..position - 1) {
            builder.append("\nMore details information here.")
        }
        return builder.toString()
    }

    // A dummy item representing a piece of content.
    data class DummyItem(val id: String, val content: String, val details: String) {
        override fun toString(): String = content
    }
}

все прыжки/данные прыжков

// allJumps is of type LiveData<List<JumpData>>

@Entity
data class JumpData (
    @PrimaryKey var jumpNumber: Int,
    var location: String?
}

Модель представления

class JumpViewModel(application: Application) : AndroidViewModel(application) {

    // The ViewModel maintains a reference to the repository to get data.
    private val repository: JumpRepository
    // LiveData gives us updated words when they change.
    val allJumps: LiveData<List<JumpData>>

    init {
        // Gets reference to WordDao from WordRoomDatabase to construct
        // the correct WordRepository.
        val jumpsDao = JumpRoomDatabase.getDatabase(application, viewModelScope).jumpDao()
        repository = JumpRepository(jumpsDao)
        allJumps = repository.allJumps // OF INTEREST <----------------------------------------------------
    }

    fun insert(jump: JumpData) = viewModelScope.launch {
        repository.insert(jump)
    }

    fun getJumps() : LiveData<List<JumpData>> {
        return allJumps
    }
}

person blackst0ne    schedule 20.03.2020    source источник


Ответы (1)


Вы можете попробовать добавить это в object DummyContent

object DummyContent {
    val jumpsLiveData = MutableLiveData<List<JumpData>>()

    private val observedLiveData: LiveData<List<JumpData>>? = null
    private val dataObserver = object : Observer<List<JumpData>> {
        override fun onChanged(newList: List<JumpData>) {
            // Do something with new data set
        }
    }
    fun observeJumpsData(jumpsLiveData: LiveData<List<JumpData>>) {
        observedLiveData?.removeObserver(dataObserver)
        observedLiveData = jumpsLiveData.apply { 
            observeForever(dataObserver)
        }
    }
}

И это для блока инициализации viewModel:

init {
        val jumpsDao = JumpRoomDatabase.getDatabase(application, viewModelScope).jumpDao()
        repository = JumpRepository(jumpsDao)
        allJumps = repository.allJumps
        DummyContent.observeJumpsData(getJumps())
    }

По этому коду DummyContent автоматически подпишется на новые данные после создания ViewModel

И в «Активности», где вы создали RecyclerView, добавьте этот текст в конец onCreate:

override fun onCreate(savedState: Bundle?) {
  DummyContent.jumpsLiveData.observe(this, Observer {
    recyclerAdapter.changeItemsList(it)
  }
}

changeItemsList - метод, который меняет данные вашего ресайклера, я полагаю, вы его уже создали

person Mykhailo Plotnikov    schedule 20.03.2020
comment
Спасибо за ваше предложение! Пока RecyclerView остается пустым, что, я думаю, ожидается, поскольку я оставляю onChanged() как есть. Но я все еще борюсь с добавлением allJumps (из ViewModel) в список. Не могли бы вы дать мне строку кода для этого? - person blackst0ne; 20.03.2020
comment
Добавлено содержимое настроек в адаптер RecyclerView. - person Mykhailo Plotnikov; 24.03.2020