You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在onBindViewHolder()中移除元素后获取ArrayList当前长度的方法

问题描述

我有一个包含RecyclerView的Fragment,在Adapter的onBindViewHolder()方法中通过点击图标删除列表元素的功能运行正常,但移除元素后,需要在Fragment中获取该ArrayList的当前长度,请问要在onBindViewHolder()中调用什么方法实现?

提供的Adapter代码

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

    val cR = context.contentResolver
    val type = cR.getType(listeImg[position])

    if(type.toString().contains("mp4")) {
        val con = MediaController(context)
        con.setAnchorView(holder.imageForList)
        con.setMediaPlayer(holder.playing)

        holder.playing.setOnPreparedListener { it ->
            it.setVolume(0F,0F)
            it.isLooping = true
        }
        holder.playing.keepScreenOn = true
        holder.playing.setVideoURI(listeImg[position])
        holder.playing.start()
        holder.playVideo.visibility = View.VISIBLE
        holder.playing.visibility = View.VISIBLE
    } else {
        holder.delete.visibility = if (listeImg.size == 0) View.INVISIBLE else View.VISIBLE
        holder.playing.visibility = View.INVISIBLE
        holder.playVideo.visibility = View.INVISIBLE

        Glide.with(context).load(listeImg[position])
            .placeholder(R.drawable.no_image)
            .skipMemoryCache(false)
            .into(holder.imageForList)
    }
    
    holder.delete.setOnClickListener {
        listeImg.removeAt(position)
        notifyItemRemoved(position)
        notifyItemRangeChanged(position, listeImg.size)
    }
}

override fun getItemCount(): Int {
    return listeImg.size
}
解决方案

要在Fragment中获取删除后的列表长度,最可靠的方式是通过回调接口让Adapter主动通知Fragment数据变化,具体实现步骤如下:

1. 在Adapter中定义回调接口

在Adapter类内部添加一个接口,用于传递删除后的列表长度:

interface OnItemDeleteListener {
    fun onItemDeleted(newListSize: Int)
}

2. 在Adapter中添加接口实例并提供设置方法

private var onItemDeleteListener: OnItemDeleteListener? = null

// 给外部设置监听的方法
fun setOnItemDeleteListener(listener: OnItemDeleteListener) {
    this.onItemDeleteListener = listener
}

3. 修改删除按钮的点击事件,触发回调

在删除元素后,调用接口方法把最新的列表长度传递给Fragment:

holder.delete.setOnClickListener {
    listeImg.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, listeImg.size)
    // 通知Fragment最新长度
    onItemDeleteListener?.onItemDeleted(listeImg.size)
}

4. 在Fragment中实现回调接口

在Fragment初始化Adapter的位置,设置监听并处理最新长度:

// 假设你的Adapter实例名为imageAdapter
imageAdapter.setOnItemDeleteListener(object : YourAdapterName.OnItemDeleteListener {
    override fun onItemDeleted(newListSize: Int) {
        // 在这里拿到最新的列表长度,执行你需要的逻辑
        // 比如更新Fragment中的UI提示,或者做其他业务处理
        Log.d("FragmentTag", "当前列表剩余元素数量:$newListSize")
    }
})

补充方案:直接获取Adapter的itemCount

如果你不需要实时通知,也可以在Fragment中随时通过yourAdapter.itemCount获取当前列表长度,因为Adapter的getItemCount()方法返回的就是listeImg.size,这个值是实时更新的。但如果需要在删除动作完成后立刻触发逻辑,回调的方式更合适。


内容的提问来源于stack exchange,提问作者Captai-N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:42:54