适配器不加载我的房间数据库列表

时间:2018-04-19 16:43:58

标签: android sqlite adapter android-room

我正在遵循一些指南和调整变量名称以适合我自己的项目。我的问题是大多数人似乎没有从Room db加载到适配器,所以当尝试打开应用程序时我的视图显示为空。当我使用DB浏览器检查数据库的SQLite时,我可以看到我的数据库包含7个项目。

主要活动

package com.example.android.budgetproject

import android.arch.persistence.room.RoomDatabase
import android.content.Context
import android.content.SharedPreferences
import android.databinding.DataBindingUtil
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import com.example.android.budgetproject.databinding.ActivityMainBinding
import com.example.android.budgetproject.popUp.DepenseDetails
import com.example.android.budgetproject.popUp.NewBudget


class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener, BudgetVM.NewButtonClick {
    lateinit var budget : SharedPreferences
    var budgetTotal: String? = null
    val vm = BudgetVM()
    lateinit var db: RoomDatabase
    lateinit var adapter: TransactionAdapter


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.vm = vm

        //Get the Total Budget in the shared pref and display it
        budget = getSharedPreferences("Budget", Context.MODE_PRIVATE)
        budget.registerOnSharedPreferenceChangeListener(this)
        budgetTotal = budget.getString("BudgetTotal", null)
        adapter = TransactionAdapter()
        //Open Dialog if new user.
        if(budgetTotal == null) {
            NewBudget.createPopUp(this)
        } else {
            vm.budgetTotal.set(budgetTotal)
        }
        vm.listener = this
        //Room
        db = MyDatabase.getInstance()
        //Adapter
        val handler = Handler()
        Thread({
            val transactionFromDb = MyDatabase.mInstance?.transactionDao()?.getAllTransaction()
            handler.post({
                if (transactionFromDb != null) adapter.addTransaction(transactionFromDb)
            })
        }).start()
        adapter.notifyDataSetChanged()

    }

    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        vm.budgetTotal.set(budgetTotal)
    }

    override fun newTransactionClicked(){
        DepenseDetails.createTransaction(this)
    }
}
道:

package com.example.android.budgetproject


import android.arch.persistence.room.*
import com.example.android.budgetproject.Transaction
import android.arch.persistence.room.Delete
import android.arch.persistence.room.Dao

@Dao
interface TransactionDao {

    @Query("SELECT * FROM `transaction`")
    fun getAllTransaction(): List<Transaction>

    @Query("SELECT * FROM `transaction` where uid IN (:transactionId)")
    fun findTransactionById(transactionId: IntArray): List<Transaction>

    @Insert(onConflict = 1)
    fun insertTransaction(transaction: Transaction)

    @Delete
    fun deleteTransaction(transaction: Transaction)
}

适配器:

package com.example.android.budgetproject

import android.support.v7.recyclerview.extensions.ListAdapter
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.activity_main.view.*
import kotlinx.android.synthetic.main.row_depense_fragment.view.*

/**
 * Created by olivier on 2018-03-13.
 */

class TransactionAdapter(private val clickListener: ButtonClick? = null):
        ListAdapter<Transaction, TransactionAdapter.ViewHolder>(TransactionDiffCallback()) {

    interface ButtonClick{
        fun clicked(id: Int)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        return ViewHolder(inflater.inflate(R.layout.row_depense_fragment, parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){

        fun bind(transaction: Transaction){
            itemView.tv_depense_description.text = transaction.description
            itemView.tv_depense.text = transaction.depense
            itemView.tv_depense_date.text = transaction.date
            itemView.setOnClickListener{
               clickListener?.clicked(adapterPosition)
            }
        }
    }

    private var transactionList = ArrayList<Transaction>()

    fun addTransaction(list: List<Transaction>){
        transactionList.clear()
        transactionList.addAll(list)
        notifyDataSetChanged()
    }
}

用于创建数据库项目的工具。

package com.example.android.budgetproject

import android.os.AsyncTask
import android.widget.Toast

class TransactionCreation {

    fun transactionCreation(depense: String, description: String, date: String){
        val newTransaction = Transaction(depense, description, date)
        val db = MyDatabase

        object : AsyncTask<Void, Void, Void>() {
            override fun doInBackground(vararg params: Void?): Void? {
                db.getInstance().transactionDao().insertTransaction(newTransaction)
                return null
            }

            override fun onPostExecute(result: Void?) {
                super.onPostExecute(result)
                Toast.makeText(BudgetApplication.getContext(), "Transaction saved", Toast.LENGTH_SHORT)
            }
        }.execute()
    }
}

这里也是项目github的链接应该是最新的。

https://github.com/OlivierLabelle/BudgetProject

感谢您的检查。

1 个答案:

答案 0 :(得分:0)

通过处理程序在notifyDataSetChanged中的线程内设置MainActivity