Как вернуть значение из темы? - PullRequest
0 голосов
/ 21 мая 2019

Я хочу передать arrayList в конструктор адаптера. Arraylist возвращается по запросу. Запрос должен быть в теме. Как я могу это сделать?

CostDao.kt

@Dao
interface CostDAO {

    @Query("select * from Cost")
    fun getAll() : List<Cost>

MainActivity.kt



class ComparatorActivity : AppCompatActivity(), OpenDatabase.OpenDatabaseListener {
    private var db: AppDatabase? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val open = OpenDatabase(this)
        open.setOpenDatabaseListener(this)
        open.load()
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        Threads()


//i need to pass the arraylist
        val adapter = MyAdapter(this, )

        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        recyclerView.adapter = adapter

}
    fun Threads() {
        Thread {
            val List = db!!.costDAO().getAll()
        }.start()
}


Как я могу вернуть список из темы? а затем передать его конструктору адаптера.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Создайте новый экземпляр Adapter, когда данные будут готовы, и установите для него значение recyclerView:

Thread {
    val itemsList...// from db
    runOnUiThread {
        recyclerView.adapter = MyAdapter(this, itemsList)
    }
}.start()

, вы можете альтернативно создать метод setItems (в вашем adapter)и назначьте его так:

class MyAdapter... {

    private val items = mutableListOf<Cost>()

    fun setItems(items: List<Cost>) {
        this.items.clear()
        this.items.addAll(items)
        notifyDataSetChanged()
    }
}

и

Thread {
    val itemsList...// from db
    runOnUiThread {
        (recyclerView.adapter as MyAdapter).setItems(itemsList)
    }
}.start()

Я также предлагаю использовать AsyncTask вместо обычного потока

0 голосов
/ 21 мая 2019

Вы можете передать пустой список конструктору адаптера, а когда данные, извлеченные из базы данных, вызовут adaptor.notifydatasetchanged (), но список должен быть тем же объектом.

class ComparatorActivity : AppCompatActivity(), OpenDatabase.OpenDatabaseListener {
    private var db: AppDatabase? = null
    var list = listOf<Cost>()
    private lateinit var adapter: MyAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val open = OpenDatabase(this)
        open.setOpenDatabaseListener(this)
        open.load()
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)

        adapter = MyAdapter(this,list)
        Threads()

        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
        recyclerView.adapter = adapter
    }
    fun Threads() {
        Thread {
            list = db!!.costDAO().getAll()
            adapter.notifyDataSetChanged()
        }.start()
}
...