【问题标题】:Adapter doesn't load my Room db list适配器未加载我的 Room db 列表
【发布时间】:2018-04-19 16:43:57
【问题描述】:

我正在遵循一些指南并调整变量名称以适合我自己的项目。我的问题是大多数人似乎没有从 Room 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

感谢您的检查。

【问题讨论】:

    标签: android sqlite adapter android-room


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多