Небольшая история в этой теме: приложение просто обновляет значения строки клика в диалоге после подтверждения.Использует сценарий разбиения на страницы в базе данных комнаты.
Когда элемент добавляется или удаляется, последний набор данных выбирается и передается в метод submitList, тогда все изменения видны и хорошо работают.
Проблема начинается там, если существующий элемент обновлен, снова последний набор данных правильно извлекается и передается submitList, но изменения этого времени не кажутся.
Когда я отлаживаю DIFF_CALLBACK
и поймаю свой элемент в areItemsTheSame
,значения newHistory
и oldHistory
одинаковы!(Как!)
В методе submitList
может быть какая-либо ошибка?
- Room v.: 2.1.0-alpha02
- Paging v.: 2.1.0-beta01
После инициализации observe
получает список из комнаты и передает mHistoryAdapter.submitList(it)
.Затем, если я обновляю элемент, наблюдение снова срабатывает (и я вижу обновленное значение в параметре it
) и переходит к submitList
.
К сожалению, адаптер не изменится ...
mResolvedAddressViewModel = ViewModelProviders.of(this).get(ResolvedAddressViewModel::class.java)
mResolvedAddressViewModel.getAddresses(false).observe(this, Observer {
mHistoryAdapter.submitList(it)
})
Все детали
Модель
@Parcelize
@Entity
data class ResolvedAddress(
@PrimaryKey var id: String = UUID.randomUUID().toString(),
var requestedLat: Double = 0.0,
var requestedLon: Double = 0.0,
var requestedAddress: String = "",
var lat: Double,
var lon: Double,
var address: String,
var country: String,
var countryCode: String,
var city: String,
var alias: String? = null,
var favorite: Boolean = false,
var provider: String? = null,
var lastUseDate: Long = 0L) : Parcelable
Адаптер
class HistoryAdapter(var context: Context)
: PagedListAdapter<ResolvedAddress, HistoryItemHolder>(DIFF_CALLBACK) {
companion object {
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<ResolvedAddress>() {
override fun areItemsTheSame(
oldHistory: ResolvedAddress, newHistory: ResolvedAddress): Boolean {
return oldHistory.id == newHistory.id
}
override fun areContentsTheSame(
oldHistory: ResolvedAddress, newHistory: ResolvedAddress): Boolean {
return oldHistory == newHistory
}
}
}
}
Фрагмент
class HistoryFragment : Fragment() {
private lateinit var mHistoryAdapter: HistoryAdapter
private lateinit var mResolvedAddressViewModel: ResolvedAddressViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_history, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerViewHistory.setHasFixedSize(true)
recyclerViewHistory.layoutManager = LinearLayoutManager(activity)
recyclerViewHistory.itemAnimator = DefaultItemAnimator()
mHistoryAdapter = HistoryAdapter(context!!)
recyclerViewHistory.adapter = mHistoryAdapter
mResolvedAddressViewModel = ViewModelProviders.of(this)
.get(ResolvedAddressViewModel::class.java)
mResolvedAddressViewModel.getAddresses(false).observe(this, Observer {
mHistoryAdapter.submitList(it)
})
}
}