RecyclerView选中状态滚动后显示异常问题求助
解决RecyclerView滚动时选中状态丢失的问题
核心原因
RecyclerView会复用ViewHolder,你只在点击时修改了当前ViewHolder的图标,但滚动后复用的ViewHolder没有根据数据源的状态重新设置图标,导致显示错误。
具体修复步骤
在
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)); } // 原有的点击事件逻辑... }点击事件中更新数据后刷新单个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
相关产品推荐
相关产品推荐

