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

Kotlin+Firebase项目中RecyclerView列表内图片随机消失问题求助

问题修复:RecyclerView加载Firebase存储图片随机空白

核心故障根因

  • 数据加载逻辑错误:每次遍历单条Firebase数据就重新初始化并设置Adapter,同时未清空旧数据列表,导致Adapter被反复创建、数据重复叠加、视图绑定逻辑混乱,Picasso的图片加载请求被反复触发、覆盖,最终大部分图片加载被中断。
  • Adapter冗余逻辑冲突:同时持有articleList、dataList两个数据集,setDataList方法完全未被使用,数据逻辑不一致。
  • 主线程资源阻塞:ViewHolder初始化块中添加了完全无关的Firebase实时监听,每创建一个列表项就新增一个全局监听,大量占用主线程资源,阻塞Picasso的图片加载任务执行。
  • 图片加载逻辑不完善:未处理RecyclerView视图复用场景,未添加加载错误/占位配置,加载失败时直接显示空白。

具体修复方案

1. 修正Fragment的数据加载逻辑

修改getUserData方法,遍历完全部数据后仅设置一次Adapter,每次数据更新前清空旧列表:

private fun getUserData() {
    dbref = FirebaseDatabase.getInstance().getReference("Vente")
    dbref.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            // 先清空旧数据,避免重复叠加
            userArrayList.clear()
            for (userSnapshot in snapshot.children){
                val user = userSnapshot.getValue(DataClassArticle::class.java)
                user?.let { userArrayList.add(it) }
            }
            // 遍历完全部数据后再设置一次Adapter,不要放在循环里
            if (!::articleAdapter.isInitialized) {
                articleAdapter = ArticleAdapter(userArrayList)
                userRecyclerview.adapter = articleAdapter
            } else {
                // 后续数据更新直接刷新Adapter即可
                articleAdapter.notifyDataSetChanged()
            }
        }
        override fun onCancelled(error: DatabaseError) {
            Log.e(TAG, "数据加载失败: ${error.message}")
        }
    })
}

同时清理FragmentonViewCreated中的冗余布局管理器配置:

override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {
    super.onViewCreated(itemView, savedInstanceState)
    btnPublierVente.setOnClickListener {
        val bottomSheet = BottomsheetVentes()
        bottomSheet.show(fragmentManager!!, "BottomSheet")
    }
    // 直接初始化RecyclerView,不要嵌套在rvPosts.apply里重复绑定
    userRecyclerview = rvPosts
    userRecyclerview.setHasFixedSize(true)
    userArrayList = arrayListOf()
    // 直接设置网格布局,不要先设置LinearLayoutManager再覆盖
    userRecyclerview.layoutManager = GridLayoutManager(requireContext(), 2)
    getUserData()
}

2. 清理Adapter冗余逻辑

删除ViewHolder中无关的Firebase监听,删除未使用的dataList变量和setDataList方法:

class ArticleAdapter(private var articleList: ArrayList<DataClassArticle>) : RecyclerView.Adapter<ArticleAdapter.ViewHolder>() {
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var articleImage : ImageView = itemView.findViewById(R.id.articleImage)
        var articleTitle : TextView = itemView.findViewById(R.id.titreArticle)
        var articlePrice : TextView = itemView.findViewById(R.id.prixArticle)
        var articleLocalisation : TextView = itemView.findViewById(R.id.nomVilleArticle)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent.context)
            .inflate(R.layout.post_vente, parent, false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(holder: ArticleAdapter.ViewHolder, position: Int) {
        val data = articleList[position]
        holder.articleTitle.text = data.titrevente
        holder.articlePrice.text = data.prixvente
        holder.articleLocalisation.text = data.zone
        // 优化Picasso加载逻辑,适配ImageView大小,添加错误占位
        Picasso.get()
            .load(data.photo)
            .fit()
            .centerCrop()
            // 替换为你自己的占位图资源
            .placeholder(R.drawable.ic_placeholder)
            .error(R.drawable.ic_error_img)
            .into(holder.articleImage)
    }
    override fun getItemCount() : Int = articleList.size
}

内容的提问来源于stack exchange,提问作者Yam Re

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 07:42:01