我有一个对话框,我想添加一个 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);
}
最佳答案
您将
radOn
和radOff
设置为相同的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);
看起来简单多了
呼唤
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/