【问题标题】:Why my pagedList is not updated via LiveData method .observe?为什么我的 pagedList 没有通过 LiveData 方法 .observe 更新?
【发布时间】:2019-06-19 15:41:39
【问题描述】:

我有这个方法的道。

@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>

【问题讨论】:

  • 更新列表的问题是日历类型的传输值定义不正确到 viewModel 变量“费用”。其余代码正常工作。希望对某人有所帮助。

标签: android android-architecture-components android-paging


【解决方案1】:

您必须在提交列表之后调用 simpleExpenseAdapter.notifyDataSetChanged()

发生这种情况是因为当您调用 simpleExpenseAdapter::submitList 时等效于调用 simpleExpenseAdapter:submitList() 而此时未调用列表差异。因此,您必须通知列表已更改。

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

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

【讨论】:

  • 没有。这是我的代码。 viewModel.expenses.observe(this, Observer&lt;PagedList&lt;Expense&gt;&gt; { simpleExpenseAdapter.submitList(it) })。我做得对吗?
  • 即使在submitList之后使用notifyDataSetChanged?
  • 不幸的是 notify 并没有改变任何东西。
【解决方案2】:

尝试将toLiveDataPaging library overview 的原始示例一起使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多