java - 当我使用对话框时,RecyclerView 和 ListView 中的所有值都在变化

标签 java android listview android-recyclerview

我有一个对话框,我想添加一个 recyclerView 或 listView,我知道我必须使用一个列表来控制每一行中的项目。现在,当我想更改复选框或单选按钮的值时,列表中的所有数据都在更改。我使用了 Log,我得到了所有的 boolean 数据同时发生了变化。我将所有项目移至 Activity 中,但问题仍然存在。 arrayList 数据之间似乎存在联系。

我还更改了我的代码并使用了 SwitchCompat,但是当我只想更改其中一个时,mDataSet 中的所有 boolean 数据都在更改。

    public class AdapterSetOnOffTime extends RecyclerView.Adapter<AdapterSetOnOffTime.ViewHolder> {

    private Context mContext;
    private ArrayList<StructSetOnOffTime> mDataSet;
    private View mView;

    public AdapterSetOnOffTime(Context context, ArrayList<StructSetOnOffTime> dataSet) {
        mContext = context;
        mDataSet = dataSet;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int id = R.layout.layout_list_settime_items;
        mView = LayoutInflater.from(mContext).inflate(id, parent, false);
        return new ViewHolder(mView);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.mSwitch.setChecked(mDataSet.get(position).setOnOffValue);
        holder.mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if(isChecked){
                    mDataSet.get(position).setOnOffValue = true;
                }else{
                    mDataSet.get(position).setOnOffValue = false;
                }
            }
        });
    }

    @Override 
    public int getItemCount() {
        return mDataSet.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView mTextTitle;
        public TextView mTextValue;
        public ImageButton mBtn;
        public SwitchCompat mSwitch;

        public ViewHolder(View itemView) {
            super(itemView);
            mTextTitle = (TextView) itemView.findViewById(R.id.txtSetTime);
            mTextValue = (TextView) itemView.findViewById(R.id.txtOnOffStatus);
            mBtn = (ImageButton) itemView.findViewById(R.id.btnSetTime);
            mSwitch = (SwitchCompat) itemView.findViewById(R.id.swPrefSwitch);
        }
    }
}

更新答案

在浪费了一天之后,我意识到我在填充 ArrayList 时犯了一个小错误,我将分享它。

上一个填充适配器的方法:

    StructSetOnOffTime item = new StructSetOnOffTime();
    ArrayList<StructSetOnOffTime> arrayList = new ArrayList<>();
    for(int i = 0; i < 9; i++){
        item.setTimeValue = null;
        item.setOnOffValue = false;
        arrayList.add(item);
    }

正如@Anatoli 所说,我在这部分遇到了问题,我通过将上面的方法更改为这个方法解决了这个问题:

    ArrayList<StructSetOnOffTime> arrayList = new ArrayList<>();
    for(int i = 0; i < 9; i++){
        StructSetOnOffTime item = new StructSetOnOffTime();
        item.setTimeValue = null;
        item.setOnOffValue = false;
        arrayList.add(item);
    }

最佳答案

  1. 您将 radOnradOff 设置为相同的 OnCheckedChangeListener 并检查监听器是否设置为 true。你为什么不做 2 个听众?

    CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mDataSet.get(position).onOffStatus = true;
    
                // update adapter
                notifyDataSetChanged();
            }
        }
    };
    holder.radOn.setOnCheckedChangeListener(listener);
    
    CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mDataSet.get(position).onOffStatus = false;
    
                // update adapter
                notifyDataSetChanged();
            }
        }
    };
    holder.radOff.setOnCheckedChangeListener(listener);
    

看起来简单多了

  1. 呼唤

    holder.radOn.setChecked(holder.radOn == buttonView);
    holder.radOff.setChecked(holder.radOff == buttonView);
    

触发监听器。要更新列表中的值,只需调用 adapter.notifyDataSetChanged();

更新

对于列表中的每个新项目,您必须初始化新的 Holder

回收 View

@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    // Inflate the custom layout
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(layoutId, parent, false);

    return new Holder(itemView, viewType);
}

数组列表

@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
    Holder viewHolder;

    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);

        viewHolder = new Holder(convertView);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (Holder) convertView.getTag();
    }

    Item item = getItem(position);

    fill(item, position);

    return convertView;
}

关于java - 当我使用对话框时,RecyclerView 和 ListView 中的所有值都在变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46532857/

相关文章:

java - 更新 'Android Support Libary' v22 后无法连接到 Parse.com

java - 在准备好的语句中将负 java long 转换为 clickhouse Uint64

java - 滑动选项卡时更改菜单项

android - 从 android 推送通知解析包

android - RecyclerView 未被点击

java - Android:如何在创建列表时禁用列表项

java - 使用 switch 语句计算对象变量出现次数不起作用

java - 定时器错误 java.lang.IllegalStateException

java - Espresso - 如何检查是否显示其中一个 View

c# - ListView点击空白区域时未触发点击事件