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

Android Adapter中itemView.setSelected状态无法持久化问题求助

解决方案

核心问题是点击事件中直接修改View状态会和onBindViewHolder的状态同步逻辑冲突,必须让数据模型(Data)作为唯一状态源,点击事件只更新数据,View状态完全由onBindViewHolder同步。

修正后的initClickListeners代码

initClickListeners(ViewHolder holder){
    // 修正拼写错误:getAdapterPostition → getAdapterPosition
    holder.itemView.setOnClickListener(v -> {
        int position = holder.getAdapterPosition();
        if (position == RecyclerView.NO_POSITION) return; // 防止位置无效
        
        Data data = getItem(position);
        // 基于Data的当前状态计算新状态,而非View的状态
        boolean newSelectedState = !data.isSelected();
        data.setSelected(newSelectedState);
        notifyItemChanged(position);
    });

    holder.ivLike.setOnClickListener(v -> {
        int position = holder.getAdapterPosition();
        if (position == RecyclerView.NO_POSITION) return;
        
        Data data = getItem(position);
        selectedAdpater.notifyFormDataChange(position);
        String idx = data.getFormIdx();
        notifyItemChanged(position);
    });
}

关键说明

  1. 以Data为唯一状态源:所有选中状态的修改都直接操作Data对象,保证状态持久化,避免View状态和数据模型脱节。
  2. 避免直接修改View状态:点击事件中不再调用holder.itemView.setSelected(),而是通过notifyItemChanged触发onBindViewHolder,由它统一将Data的状态同步到View,这样selector的表现和数据持久化就能同时满足。
  3. 增加位置有效性判断:添加position == RecyclerView.NO_POSITION的判断,防止RecyclerView复用过程中出现位置无效的异常。

你的onBindViewHolder代码无需修改,它已经正确地将Data的状态同步到View上,这样就能实现:

  • itemView点击时,Data的selected状态更新,View同步更新,selector表现正常
  • 滚动复用或重新加载时,View状态会从Data中读取,保证持久化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:25:15