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

RecyclerView选中状态滚动后显示异常问题求助

解决RecyclerView滚动时选中状态丢失的问题

核心原因

RecyclerView会复用ViewHolder,你只在点击时修改了当前ViewHolder的图标,但滚动后复用的ViewHolder没有根据数据源的状态重新设置图标,导致显示错误。

具体修复步骤

  1. 在onBindViewHolder中绑定状态
    每次绑定ViewHolder时,必须根据数据源la中对应球员的Select状态设置图标,确保复用的ViewHolder能正确显示当前状态:

    @Override
    public void onBindViewHolder(YourViewHolder holder, int position) {
        // 获取当前球员数据
        Player player = la.get(position);
        
        // 根据Select状态设置对应图标
        if ("Y".equals(player.Select)) {
            holder.imageClick.setImageDrawable(holder.itemView.getContext().getDrawable(R.drawable.valoknew));
        } else {
            holder.imageClick.setImageDrawable(holder.itemView.getContext().getDrawable(R.drawable.valnoknew));
        }
    
        // 原有的点击事件逻辑...
    }
    
  2. 点击事件中更新数据后刷新单个Item
    修改点击事件,更新数据源后调用notifyItemChanged(position)代替全局刷新,既高效又能确保当前Item重新绑定数据:

    holder.imageClick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Player currentPlayer = la.get(position);
            String keyJoeur = "l" + currentPlayer.Licence;
            
            if ("N".equals(currentPlayer.Select)) {
                mDatabase.child("Joueurs").child(keyJoeur).child("Selected").setValue("Y");
                currentPlayer.Select = "Y";
            } else {
                mDatabase.child("Joueurs").child(keyJoeur).child("Selected").setValue("N");
                currentPlayer.Select = "N";
            }
            
            // 仅刷新当前位置的Item
            notifyItemChanged(position);
        }
    });
    

补充说明

之前调用notifyDataSetChanged无效,是因为你没有在onBindViewHolder中根据数据源状态更新UI,即使全局刷新,复用的ViewHolder也不会自动同步状态。按上述步骤修改后,滚动时ViewHolder会根据最新数据重新渲染图标,状态就不会丢失了。

内容的提问来源于stack exchange,提问作者Georges GRESSIEN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:39:30