bla*_*ara 12 android android-architecture-components android-paging androidx
这个主题的小故事:应用程序只是在确认后用对话框更新点击行的值.在房间数据库上使用分页方案.
添加或删除项目时,将获取最新数据集并将其传递给submitList方法,然后可以看到所有更改并运行良好.
问题从那里开始,如果现有项目更新,则再次正确获取最新数据集并传递给submitList,但这次似乎没有变化.
当我调试DIFF_CALLBACK并抓住我的项目时areItemsTheSame,newHistory和oldHistory值是一样的!(怎么样!)
submitList方法中可能有任何错误?
初始化后,observe从房间中提取列表并传递给mHistoryAdapter.submitList(it).然后,如果我更新一个项目,观察再次被触发(我在param中看到更新的值it)并传递给submitList.
不幸的是,适配器不会改变......
    mResolvedAddressViewModel = ViewModelProviders.of(this).get(ResolvedAddressViewModel::class.java)
    mResolvedAddressViewModel.getAddresses(false).observe(this, Observer {
        mHistoryAdapter.submitList(it)
    })
Run Code Online (Sandbox Code Playgroud)
所有部件
模型
@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
Run Code Online (Sandbox Code Playgroud)
适配器
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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
分段
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)
        })
    }
}
Run Code Online (Sandbox Code Playgroud)
    该问题中缺少几件事,可能有助于提供更详细的答案。
例如 你RecyclerView.Adapter长什么样 它会扩展PagedListAdapter吗?
您的模型课程是什么样的?它是Kotlin数据类吗?
为了提供答案,让我们假设那些未知数是我们所期望的。
如果我理解这个问题,似乎您只是updating一个项目,而没有删除或添加任何项目。因此,DiffUtil.ItemCallback的areItemsTheSame将始终返回true,因为旧列表和新列表的大小均未修改。意思是,如果您更新了一项,则可能已更新了其内容,而未将其从列表中删除。
因此,areItemsTheSame将返回true,因为它们的id仍然相同。
areContentsTheSame由于更新了项目的内容,因此第二种方法更有可能返回false。
如果您的模型类ResolvedAddress是Kotlin数据类,则areContentsTheSame在比较从旧列表和新列表更新的项目时,该方法应返回false。这将onBindViewHolder在此时触发适配器中的方法,以便您将该项目与更新的数据重新绑定。
如果该模型不是Kotlin data class,则必须确保该类实现该compareTo方法。如果不是,则将对象的内存地址与对象的实际内容进行比较。在这种情况下,该方法areContentsTheSame将始终返回true,因为对象的内存地址未更改。
这些是一些调试技巧,因为如果没有更多有关如何实现代码的知识,很难提供更清晰的答案。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2252 次  |  
        
|   最近记录:  |