前言
在Recyclerview中使用Switch控件时,遇到了一个以前没有遇过的问题————控件被复用,我点击了第一个开关,意外发现往后的每10个控件里面就有1个被打开了,网上很多方法试了都没用,于是改了一个上午才解决了这个问题。
解决思路
可以给对象添加一个临时变量T_IsChecked,用来判断是否被选中,在onBindViewHolder时判断T_IsChecked的状态,将switch置为相应的状态,并对switch的点击事件进行监听,然后再通过回调调用adapter的notifyDataSetChanged函数进行状态的刷新,从而解决这个方法。
代码实现
重写OnBindViewHolder函数,判断当前开关状态
if(goods.T_IsChecked){
mSwitch.setChecked(true);
} else {
mSwitch.setChecked(false);
}
//对开关控件进行监听
mSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
goods.T_IsChecked = !goods.T_IsChecked;
if(mListener != null){
mListener.onItemClick();//回调刷新状态
}
}
});
回调接口
public interface onClickListener {
void onItemClick();
}
private onClickListener mListener;
public void setOnItemClickListener(onClickListener listener) {
this.mListener = listener;
}
在Activity中设置点击事件
mAdapter.setOnItemClickListener(new MyAdapter.onClickListener() {
@Override
public void onItemClick() {
//滑动停止时刷新数据,不加这行判断会导致程序崩溃
if (!rv_menu_goods.isComputingLayout() && RecyclerView.SCROLL_STATE_IDLE == rv_menu_goods.getScrollState()) {
mAdapter.notifyDataSetChanged();
}
}
});