【已解决】 listview下滑到底部,之前的item会恢复初始状态,如何解决?
写了一个listview,每个item里面有一个switchButton,每个item绑定一个Light类,打开开关Light类的状态属性会改变。
但是发现listview拉到底后(顶部的item移出界面),再拉回到顶部,switchButton的状态被初始化了,这该如何解决?
private class LightsDataAdapter extends BaseAdapter {
//定义操作的灯
public Light light;
public List<Light> lightsList;
//用于把布局文件转化为View对象
private LayoutInflater layoutInflater;
public LightsDataAdapter(Context context, List<Light> lightsList) {
this.lightsList = lightsList;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return lightsList.size();
}
@Override
public Object getItem(int position) {
return lightsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder {
RelativeLayout relativeLayout;
TextView tvName;
Switch swBtn;
}
@Override
public View getView(int position, View convertView, ViewGroup group) {
View viewItem = null;
ViewHolder viewHolder = null;
if (convertView == null) {
viewItem = layoutInflater.inflate(R.layout.listview_item_light, null);
viewHolder = new ViewHolder();
viewHolder.relativeLayout = viewItem.findViewById(R.id.list_item);
viewHolder.tvName = viewItem
.findViewById(R.id.tvName);
viewHolder.swBtn = viewItem.findViewById(R.id.btn_sw);
viewItem.setTag(viewHolder);
} else {
viewItem = convertView;
viewHolder = (ViewHolder) viewItem.getTag();
}
final Light le = lightsList.get(position);
if (le.getType() == "white" || le.getType() == "smart") {
if (le.getState() == true) {
addLightView(le.getName());
viewHolder.relativeLayout.setBackgroundColor(Color.argb(255, 255, 255, 255));
viewHolder.tvName.setTextColor(Color.parseColor("#000000"));
} else {
removeLightView(le.getName());
viewHolder.relativeLayout.setBackgroundColor(getColor(R.color.lightOff));
viewHolder.tvName.setTextColor(Color.parseColor("#ffffff"));
}
} else {
if (le.getState() == true) {
addRGBLightView(le.getName(),Color.argb(255, ((RgbLight) le).getrValue(), ((RgbLight) le).getgValue(), ((RgbLight) le).getbValue()));
viewHolder.relativeLayout.setBackgroundColor(Color.argb(255, ((RgbLight) le).getrValue(), ((RgbLight) le).getgValue(), ((RgbLight) le).getbValue()));
viewHolder.tvName.setTextColor(Color.parseColor("#000000"));
} else {
removeRGBLightView(le.getName());
viewHolder.relativeLayout.setBackgroundColor(getColor(R.color.lightOff));
viewHolder.tvName.setTextColor(Color.parseColor("#ffffff"));
}
}
viewHolder.tvName.setText(le.getName());
viewHolder.swBtn.setChecked(le.getState());
final ViewHolder finalViewHolder = viewHolder;
if (le.getType() == "white") {
viewHolder.relativeLayout.setEnabled(false);
} else {
viewHolder.relativeLayout.setEnabled(true);
}
viewHolder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("11", le.getName() + finalViewHolder.tvName.getText());
light = setColoCycle(le.getName(), (Color.rgb(((RgbLight) le).getrValue(), ((RgbLight) le).getgValue(), ((RgbLight) le).getbValue())), le);
}
});
viewHolder.relativeLayout.setOnTouchListener(onTouchListener);
viewHolder.swBtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (le.getType() == "white" || le.getType() == "smart") {
if (isChecked == true) {
le.setState(true);
addLightView(le.getName());
finalViewHolder.relativeLayout.setBackgroundColor(Color.argb(255, 255, 255, 255));
finalViewHolder.tvName.setTextColor(Color.parseColor("#000000"));
} else {
le.setState(false);
removeLightView(le.getName());
finalViewHolder.relativeLayout.setBackgroundColor(getColor(R.color.lightOff));
finalViewHolder.tvName.setTextColor(Color.parseColor("#ffffff"));
}
} else {
if (isChecked == true) {
le.setState(true);
addRGBLightView(le.getName(),Color.argb(255, ((RgbLight) le).getrValue(), ((RgbLight) le).getgValue(), ((RgbLight) le).getbValue()));
finalViewHolder.relativeLayout.setBackgroundColor(Color.argb(255, ((RgbLight) le).getrValue(), ((RgbLight) le).getgValue(), ((RgbLight) le).getbValue()));
finalViewHolder.tvName.setTextColor(Color.parseColor("#000000"));
} else {
le.setState(false);
removeRGBLightView(le.getName());
finalViewHolder.relativeLayout.setBackgroundColor(getColor(R.color.lightOff));
finalViewHolder.tvName.setTextColor(Color.parseColor("#ffffff"));
}
}
}
});
return viewItem;
}
}
SwitchButton的setChecked和onCheckedChanged解除关联解决了此问题。
list item 滑出屏幕时就意味着有新的list item 滑进屏幕,新的list item 调用getview 获取的是滑出屏幕的item 的convertView。
所以绘制新的item ,调用setChecked(), 实际调用的是旧的对象的setChecked.
现在很少用ListView了,推荐你使用RecyclerView。状态错乱的,一般是复用问题。你的判断有问题呢!!!字符串的判断用==吗?这是java哦,java用==,字符串里判断的是内存地址。你用equals吧???
上面的重新显示出来就是重新加载了 所以状态就没了 应该可以给List里增加一个状态属性 每次选中就更新list的状态