我用这种方法有道。

@Query("SELECT * FROM expense WHERE date BETWEEN :dateStart AND :dateEnd")
    fun getExpensesBetweenTheDate(dateStart: Calendar, dateEnd: Calendar):
DataSource.Factory<Int, Expense>


我的存储库得到了Dao并创建LiveData>对象。

fun getExpensesBetweenTheDate(startDay: Calendar, endDay: Calendar): LiveData<PagedList<Expense>> {
        val factory = expenseDao.getExpensesBetweenTheDate(startDay, endDay)
        val config = PagedList.Config.Builder()
            .setPageSize(30)
            .setMaxSize(200)
            .setEnablePlaceholders(true)
            .build()
        return LivePagedListBuilder(factory, config)
            .build()
    }


我的ViewModel获取存储库并创建一个变量。

val expenses = repository.getExpensesBetweenTheDate(startCalendar, endCalendar)


最后,MainActivity在LiveData上进行观察。

viewModel.expenses.observe(this, Observer(simpleExpenseAdapter::submitList))


一切正常,但是当我尝试向数据库中添加新记录时,它并没有立即出现,而是在重新启动应用程序之后出现。没有分页库的类似代码效果很好。也许我做错了。为了以防万一,我在下面给出了适配器,viewHolder和布局的代码。

适配器。

class ExpenseAdapter : PagedListAdapter<Expense, ExpenseViewHolder>(EXPENSE_COMPARATOR) {

    companion object {
        private val EXPENSE_COMPARATOR = object : DiffUtil.ItemCallback<Expense>() {

            override fun areItemsTheSame(oldItem: Expense, newItem: Expense): Boolean {
                return oldItem.expenseId == newItem.expenseId
            }

            override fun areContentsTheSame(oldItem: Expense, newItem: Expense): Boolean {
                return oldItem == newItem
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExpenseViewHolder {
        return ExpenseViewHolder.create(parent)
    }

    override fun onBindViewHolder(holder: ExpenseViewHolder, position: Int) {
        val expenseItem = getItem(position)
        if (expenseItem != null) holder.bind(expenseItem)
    }
}


ViewHolder。

class ExpenseViewHolder(binding: ExpenseElementSimpleBinding) : RecyclerView.ViewHolder(binding.root) {

    private val mBinding = binding

    init {
        mBinding.root.setOnClickListener {
            val intent = Intent(it.context, ShowExpenseActivity::class.java)
            intent.putExtra("expense", mBinding.expense)
            it.context.startActivity(intent)
        }
    }

    companion object {
        fun create(parent: ViewGroup): ExpenseViewHolder {
            val inflater = LayoutInflater.from(parent.context)
            val binding = ExpenseElementSimpleBinding.inflate(inflater, parent, false)
            return ExpenseViewHolder(binding)
        }
    }

    fun bind(item: Expense) {
        mBinding.apply {
            expense = item
            executePendingBindings()
        }
    }
}


布局。

<layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
                name="expense"
                type="com.example.budgetplanning.data.model.Expense"/>
    </data>

    <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <androidx.appcompat.widget.AppCompatTextView
                android:text="@{expense.description}"
                tools:text="Gasoline"
                android:padding="5dp"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"/>

        <androidx.appcompat.widget.AppCompatTextView
                android:text="@{String.valueOf(expense.amount)}"
                tools:text="123"
                android:padding="5dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

    </LinearLayout>
</layout>

最佳答案

您必须在submitList之后调用simpleExpenseAdapter.notifyDataSetChanged()

发生这种情况的原因是,当您当前未调用列表diff时,调用simpleExpenseAdapter :: submitList等效于调用simpleExpenseAdapter:submitList()。因此,您必须通知该列表已更改。

或者,您可以将新列表作为参数传递,例如:

viewModel.expenses.observe(this, Observer<YourObjectListened> {
    simpleExpenseAdapter.submitList(it)
})

07-27 16:13