为了实现在设备旁边加载一个swith实现使用switch开关设备功能
recycler中嵌套switch,实现点击功能或者监听状态改变时经常会出现复用或者代码崩溃事件,以下代码本地实现并测试没有问题
#item对应的实体类
public class Device_recycle {
private String deviceName;//名称
private Boolean deviceState;//状态
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public void setDeviceState(Boolean deviceState) {
this.deviceState = deviceState;
}
public Device_recycle(String name, Boolean state){
this.deviceName = name;
this.deviceState = state;
}
public String getDeviceName() {
return deviceName;
}
public Boolean getDeviceState() {
return deviceState;
}
}
#适配器类
public class deviceAdapter extends RecyclerView.Adapter<deviceAdapter.ViewHolder> {
private Context context;
private List<Device_recycle> deviceList;
static class ViewHolder extends RecyclerView.ViewHolder {
CardView cardView;
TextView deviceName;
Switch deviceState;
public ViewHolder(View view) {
super(view);
cardView = (CardView) view;
deviceName = view.findViewById(R.id.card_deviceName);
deviceState = view.findViewById(R.id.card_deviceState);
}
}
public deviceAdapter(List<Device_recycle> deviceList1){
this.deviceList = deviceList1;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (context == null){
context = parent.getContext();
}
View view = LayoutInflater.from(context).inflate(R.layout.device_item, parent, false);
return new ViewHolder(view);
}
//定义一个接口并暴露给外部使用
public interface OnItemClickListener {
void onClick(String deviceName, boolean deviceState, int position);//配合switch监听器中进行更改
}
private OnItemClickListener listener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
//设置item中各项状态
final Device_recycle device = deviceList.get(position);
holder.deviceName.setText(device.getDeviceName());
if(device.getDeviceState()){
holder.deviceState.setChecked(true);
}else{
holder.deviceState.setChecked(false);
}
//设置switch监听器
holder.deviceState.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {//传入了item的各项信息,供外部调用,可以按需进行更改
if(listener != null){
listener.onClick(device.getDeviceName(), isChecked, position);
}
}
});
}
@Override
public int getItemCount() {
return deviceList.size();
}
//不可删除
@Override
public int getItemViewType(int position) {
return position;
}
}
#主程序中调用
private deviceAdapter adapter;
private List<Device_recycle> deviceRecycleList = new ArrayList<>();
//数据自行准备
RecyclerView recyclerView = findViewById(R.id.recycle_view);
GridLayoutManager layoutManager = new GridLayoutManager(this, 1);
recyclerView.setLayoutManager(layoutManager);
adapter = new deviceAdapter(deviceRecycleList);
recyclerView.setAdapter(adapter);
//监控按钮点击事件
adapter.setOnItemClickListener(new deviceAdapter.OnItemClickListener() {
@Override
public void onClick(String deviceName, boolean deviceState, int position) {
/*
*实现功能的代码,本地数据库更改,服务器交互等
*/
//更改一下源数据中switch控件对应的值
/*
*本来应该使用adapter.notifyItemChange()等进行刷新以更改控件ui,但是switch开关时只更改了自己本身的属性值,
*并没有更改源数据中的值,造成列表在进行刷新时,将switch控件更改回原样,达不到所需的效果
*/
deviceRecycleList.get(position).setDeviceState(deviceState);
//不需要adapter再进行刷新,以为ui状态和源数据都已经更改完毕
}
});