android 如果回收器视图项中的数据为空,则不显示视图保持器

yjghlzjz  于 2022-12-28  发布在  Android
关注(0)|答案(1)|浏览(145)

我有一个API给予我的医生名单。在它的最后一页只有1项是有和其他项目是空的,像这样:

在此之后,我已经使用分页库分页我的pagingSource code:'

class DocPagingSource(val docRepository: DocRepository): PagingSource<Int, Data>() {
    override fun getRefreshKey(state: PagingState<Int, Data>): Int? {
        return state.anchorPosition?.let {
            state.closestPageToPosition(it)?.prevKey?.plus(1)
                ?: state.closestPageToPosition(it)?.nextKey?.minus(1)
        }
    }

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Data> {
        return try {
            val currentPage = params.key?: 1
            val city: String = ""
            val response = docRepository.getDoctors(city, currentPage)
            val page = Math.ceil(response.body()!!.total.toDouble()/5).toInt()
            val data = response.body()!!.data
            val responseData = mutableListOf<Data>()
            responseData.addAll(data)
            LoadResult.Page(
                data = responseData,
                prevKey = if(currentPage==1) null else -1,

                nextKey = if (currentPage== page) null else currentPage.plus(1)
            )

        }catch (e: HttpException){
            LoadResult.Error(e)
        }catch (e: Exception){
            LoadResult.Error(e)
        }
    }

'我的寻呼适配器代码:

class DocAdapter(val context: Context): PagingDataAdapter<Data, DocAdapter.DocViewHolder>(DiffUtil()) {
private lateinit var binding: ItemDoctorsBinding

inner class DocViewHolder : RecyclerView.ViewHolder(binding.root) {

    fun bind(item: Data?) {

            binding.apply {
                txtDocCity.text = item?.city
                txtDocName.text = item?.docName
                txtDocFees.text = item?.docConsultationFee
                txtDocYOE.text = item?.docYoE
                txtDocSpecialisation.text = item?.docSpecialisation
                Glide.with(context)
                    .load(item?.docProfileImgUrl)
                    .fitCenter()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(docPhoto)
            }

    }
}

override fun onBindViewHolder(holder: DocViewHolder, position: Int) {
    val item = getItem(position)
    if (item!=null){
        holder.bind(getItem(position)!!)
        holder.setIsRecyclable(false)
    }



}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DocViewHolder {
    val inflater = LayoutInflater.from(context)
    binding = ItemDoctorsBinding.inflate(inflater, parent, false)
    return DocViewHolder()
}

class DiffUtil: androidx.recyclerview.widget.DiffUtil.ItemCallback<Data>(){
    override fun areItemsTheSame(oldItem: Data, newItem: Data): Boolean {
        return oldItem.docId == newItem.docId
    }

    override fun areContentsTheSame(oldItem: Data, newItem: Data): Boolean {
        return oldItem==newItem
    }

}}

我在最后一页的医生列表中达到我的第16个项目后得到的应该显示条目直到第16个项目,但之后它也再次显示如下:

此外,如果我不使用pagingAdapter中的holder.setIsRecyclable(false),那么这个Android图标不会显示,但列表中填充了以前的医生:在DR.16的顶部显示如下:

在这中间又是这样的

我的doctorViewModel类:

class DocViewModel(val repository: DocRepository): ViewModel() {
val loading = MutableLiveData<Boolean>()
val docList = Pager(PagingConfig(5, maxSize = 100)){
    DocPagingSource(repository)
}.flow.cachedIn(viewModelScope)}

我的主要活动:

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var docViewModel: DocViewModel
private lateinit var docAdapter: DocAdapter
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    val docListRepository = DocRepository()
    val docFactory = DocViewModelFactory(docListRepository)
    docViewModel = ViewModelProvider(this, docFactory).get(DocViewModel::class.java)
    docAdapter = DocAdapter(this)

    lifecycleScope.launchWhenCreated {
        docViewModel.docList.collect{
            docAdapter.submitData(it)

        }
    }
    binding.docRecyclerView.apply {
        layoutManager = LinearLayoutManager(this@MainActivity)
        adapter = docAdapter
        setHasFixedSize(true)
    }

}}
o4hqfura

o4hqfura1#

我已经通过在分页源代码

中应用一个条件解决了这个错误

相关问题