代码之家  ›  专栏  ›  技术社区  ›  Victor Oliveira

MutableLiveData不会触发loadAfter使用PagedList从Android ROM获取数据

  •  0
  • Victor Oliveira  · 技术社区  · 6 年前

    一些可能的原因 loadAfter 未触发:

    Solution 1 :呼叫 getItem 里面 onBindViewHolder

    Solution 2 submitList PagedListAdapter

    Solution 3 ListAdapter 具有 页面适配器

    DataBinding 一切正常,无需寻呼。

    我在模仿我的数据源来理解发生了什么。有些函数被挂起,因为它们应该有来自ROM的数据,而ROM需要这些数据。我的代码状态应该是:

    适配器

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        getItem(position).let { wkda ->
            with(holder) {
                wkda?.apply { bind(createOnClickListener(this)) }
            }
        }
    }
    
    

    vm.manufacturers.observe(viewLifecycleOwner) { manufacturers ->            
                adapter.submitList(manufacturers)
    }
    

    视图模型

    var manufacturers: MutableLiveData<PagedList<WKDA>> = MutableLiveData()
    
    init {
      viewModelScope.launch {
        repository.getManufacturers(manufacturers)
      }
    }
    

    suspend fun getManufacturers(manufacturers: MutableLiveData<PagedList<WKDA>>) {
            withContext(Dispatchers.IO) {
                manufacturers.postValue(ManufacturerPagedList.
                    getInstance().
                    fetchPage())
            }
    }
    

    制造商页面列表

    private val executor = ManufacturerExecutor()
    
    private val paginationConfig: PagedList.Config = PagedList.Config.Builder()
            .setPageSize(PAGE_SIZE)
            .setPrefetchDistance(FETCH_DISTANCE)
            .setEnablePlaceholders(false)
            .build()
    
    companion object {
            @Volatile
            private var instance: ManufacturerPagedList? = null
                fun getInstance() = instance ?: synchronized(this) {
                    ManufacturerPagedList().also {
                        instance = it
                    }
            }
        }
    
    fun fetchPage(): PagedList<WKDA> = PagedList.Builder<Int, WKDA>(
                MockDataSource(),
                paginationConfig)
                .setInitialKey(INITIAL_KEY)
                .setFetchExecutor(executor)
                .setNotifyExecutor(executor)
                .build()
    }
    

    数据源

    class MockDataSource : PageKeyedDataSource<Int, WKDA>() {
        override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, WKDA>) {
            callback.onResult(List(20) { generatePost(params.requestedLoadSize) }.toList(), -1, 1)
        }
    
        override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, WKDA>) {
            callback.onResult(List(20) { generatePost(params.key) }.toList(), params.key + 1)
        }
    
        override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, WKDA>) {
            callback.onResult(List(20) { generatePost(params.key) }.toList(), params.key - 1)
        }
    
        private fun generatePost(key: Int): WKDA {
            return WKDA("name", "author $key")
        }
    }
    

    const val INITIAL_KEY: Int = 0
    const val PAGE_SIZE: Int = 15
    const val FETCH_DISTANCE: Int = 1
    

    我错过了什么?

    0 回复  |  直到 6 年前
        1
  •  1
  •   marc_s MisterSmith    6 年前

    检查后:loadAfter被正确调用。问题在于模型本身:

    wkda.id始终具有相同的“name”值

    DiffCallback将旧的对象列表与新的对象列表进行了比较,但没有发现差异,因此“duplicates”项没有添加到适配器中

    推荐文章