Почему мой pagedList не обновляется с помощью метода LiveData .observe? - PullRequest
1 голос
/ 19 июня 2019

У меня есть Дао с этим методом.

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

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

Ответы [ 2 ]

1 голос
/ 19 июня 2019

попробуйте использовать toLiveData с исходным примером из Обзор библиотеки подкачки

1 голос
/ 19 июня 2019

Вы должны вызвать simpleExpenseAdapter.notifyDataSetChanged () после submitList

Это происходит потому, что при вызове simpleExpenseAdapter :: submitList эквивалентно вызову simpleExpenseAdapter:submitList () когда список diff не вызывается в данный момент.Итак, вы должны уведомить, что список изменился.

Или так, вы можете передать новый список в качестве параметра, например:

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