Заполните элементы счетчика из базы данных - PullRequest
0 голосов
/ 21 июня 2019

У меня проблемы с настройкой правильной работы счетчика с элементами, которые я извлек из базы данных SQLite. Я могу отобразить элементы в раскрывающемся списке, но не могу выбрать их. Если я заменил элементы (questAddViewModel.categorylist) на простой массив строк, тогда спиннер работает правильно. Я просто не могу понять, как заставить список, заполненный из базы данных, работать вместо этого.

Я использую комнату и Дао для вызова базы данных.

Обновление: Включены скриншоты для пояснения. Если я щелкну по любому элементу на втором изображении, экран просто вернется к первому изображению, и на счетчике ничего не появится. Если я пытаюсь присвоить selectedItem строке, как я делаю в закомментированном коде

//questCategorySelected = parent.getItemAtPosition(pos).toString()

Это скажет мне, что это ноль.

  1. Снимок экрана со спиннером (Зеленая полоса)

  2. Снимок экрана, на котором Spinner показывает выпадающий элемент


Вот мой код для счетчика во Фрагменте:

//Setup Spinner for Quest Category
        val categorySpinnerAdapter = ArrayAdapter(application, android.R.layout.simple_spinner_item, questAddViewModel.categorylist) //
                categorySpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        binding.addQuestCategory.adapter = categorySpinnerAdapter
        binding.addQuestCategory.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
        {
            override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
                // An item was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)
                //questCategorySelected = parent.getItemAtPosition(pos).toString()
                //Toast.makeText(application, "${parent.getItemAtPosition(pos).toString()} <-In Selected", Toast.LENGTH_LONG).show();
            }
            override fun onNothingSelected(parent: AdapterView<*>) {
                // Another interface callback
            }
        }

Вот мой код в ViewModel

private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
val categorylist = ArrayList<String>()

 init {
        populateCategorySpinner()
    }

    fun populateCategorySpinner()
    {
        uiScope.launch {
            populateCategorySpinnerList()
        }
    }

    private suspend fun populateCategorySpinnerList()
    {
        withContext(Dispatchers.IO)
        {
            val categorylistcursor = database.getQuestCategoryCursor()

            if (categorylistcursor.moveToFirst()) {
                do {
                    val category =
                        categorylistcursor.getString(categorylistcursor.getColumnIndexOrThrow("quest_category_name"))
                    categorylist.add(category);
                } while (categorylistcursor.moveToNext())
            }
            categorylistcursor.close();
        }
    }

Это то, что у меня есть в Дао

    @Query ( "SELECT * FROM t_ql_quest_category")
    fun getQuestCategoryCursor(): Cursor

Я ищу решение для получения списка, который я извлекаю из курсора базы данных, чтобы можно было правильно выбрать его в счетчике.

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

спасибо за комментарии и ответ.Я на самом деле понял это после прочтения комментариев.Похоже, проблема в том, что массив фактически не заполнен данными из-за вызова сопрограммы в базу данных.Это сбивало с толку, потому что оно появлялось в выпадающем списке.Я решил проблему, прочитав немного больше о LiveData, и обновляю адаптер, следя за этим.Я пробовал несколько способов передать массив во Fragment из ViewModel, но без использования LiveData список всегда терялся из-за сопрограммы вызова базы данных.Если у кого-то есть лучший способ сделать это, предложения приветствуются!Спасибо!

Ниже мое решение:

Фрагмент

//Setup Spinner for Quest Category with LiveData monitoring of the Category List
        var CategoryArray: Array<String>
        var categorySpinnerAdapter: ArrayAdapter<String>

        questAddViewModel.categorylist.observe(this, Observer
        {if (it != null && it.isNotEmpty()) {
            CategoryArray = toArray(questAddViewModel.categorylist.value!!)
            categorySpinnerAdapter = ArrayAdapter(application, android.R.layout.simple_spinner_item, CategoryArray) //
            categorySpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            binding.addQuestCategory.adapter = categorySpinnerAdapter
        }})

        binding.addQuestCategory.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
        {
            override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
                // An item was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)
            }
            override fun onNothingSelected(parent: AdapterView<*>) {
                // Another interface callback
            }
        }

ViewModel

private val _categorylist = MutableLiveData<ArrayList<String>>()
    val categorylist: LiveData<ArrayList<String>>
        get() = _categorylist

 private suspend fun populateCategorySpinnerList()
    {
        withContext(Dispatchers.IO)
        {
            val categorylistcursor = database.getQuestCategoryCursor()
            val categorylistfromdb = ArrayList<String>()

            if (categorylistcursor.moveToFirst()) {
                do {
                    val category =
                        categorylistcursor.getString(categorylistcursor.getColumnIndexOrThrow("quest_category_name"))
                    categorylistfromdb.add(category);
                } while (categorylistcursor.moveToNext())
            }
            categorylistcursor.close();
            _categorylist.postValue(categorylistfromdb)
        }
    }
0 голосов
/ 21 июня 2019

Вы пытались изменить questCategorySelected = parent.getItemAtPosition (pos) .toString ()

По

questCategorySelected = (TextView) представление

...