RecyclerView在到达列表末尾后继续滚动

时间:2020-10-19 12:20:38

标签: android kotlin android-recyclerview

RecyclerView不断滚动

我正在制作媒体库应用。当我使用recyclerview列表时,它会在同一页面上滚动 项目一次又一次。它到达文件列表的底部时不会停止。

class MediaListAdapter(val mediaList: ArrayList<Media>): RecyclerView.Adapter<MediaListAdapter.MediaViewHolder>(){

private var context: Context? = null

fun updateMediaList(newMediaList: List<Media>){
    mediaList.clear()
    mediaList.addAll(newMediaList)
    notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MediaViewHolder {
    context = parent.context
    val inflater = LayoutInflater.from(parent.context)
    val view = DataBindingUtil.inflate<ItemMediaBinding>(inflater, R.layout.item_media, parent, false)
    return MediaViewHolder(view)
}

override fun onBindViewHolder(holder: MediaViewHolder, position: Int) {
    holder.view.btnPlayVideo.visibility = View.INVISIBLE
    holder.view.mediaItem = mediaList[position]
    if(mediaList[position].mediaUrl.contains(".mp4")){
        holder.view.btnPlayVideo.visibility = View.VISIBLE
        holder.view.btnPlayVideo.setOnClickListener {
            context!!.startActivity(Intent(context, VideoViewActivity::class.java).putExtra("videoUrl", mediaList[position].mediaUrl))
        }
    }
}

override fun getItemCount():Int {
    return mediaList.size
}

class MediaViewHolder(var view: ItemMediaBinding) : RecyclerView.ViewHolder(view.root)
}

那是我的适配器类。 正在从包含图像URL和与该信息有关的其他信息的数据库中提取媒体信息。

我已将我的代码与类似的解决方案进行了比较,该解决方案可以按我想要的方式工作,并且找不到导致该错误的任何原因。

val media = MutableLiveData<List<Media>>()
val loading = MutableLiveData<Boolean>()
private val mediaList = ArrayList<String>()


fun fetchFromDatabase() {
    loading.value = true
    loadImages()
    launch {
        storeMedia(mediaList)
        val media = MediaDatabase(getApplication()).mediaDao().getAllMedia()
        mediaRetrieved(media)
    }
}

private fun mediaRetrieved(mediaList: List<Media>) {
    media.value = mediaList
    loading.value = false
}

private fun storeMedia(list: List<String>) {
    var found = false
    launch {
        val dao = MediaDatabase(getApplication()).mediaDao().getAllMedia()
        for(item in list){
            found = false
            for(media in dao){
                if(item == media.mediaLocation){
                    found = true
                    break
                }
            }
            if(!found){
                val media = Media(mediaUrl = item)
                MediaDatabase(getApplication()).mediaDao().insert(media)
            }
        }
    }
}

那是我正在向recyclerview适配器添加数据时来自viewholder的代码

1 个答案:

答案 0 :(得分:0)

无论您要从哪里获取媒体信息,请检查db / api中可用项目的大小(可能是您正在接收重复的数据)。