关于CheckBox位置错位也挺烦人的,今天也是摆弄了一上午,废话不多说。
CheckBox位置错乱主要是convertView点击时复用了,所以可以将CheckBox点击使用Map进行存储,点击则添加,再点击则删除。
private Map<Integer,Boolean> map=new HashMap<>();// 存放已被选中的CheckBox
首先先写一个Map,用来存储被选中的CheckBox
viewHolder.cb.setOnCheckedChangeListener(new () {
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}if(isChecked==true){ map.put(i,true);//i就是你自己getView方法内的int i,有的人可能是postion。}else { map.remove(i);}
}
如果你使用了setOnClickListener大可以将之替换为setOnCheckedChangeListener,至于会出现什么问题,在本人使用过以后没有遇见,如果后期遇到我会再继续添加
个人修改checkbox错位就是这么简单,只添加了这一个方法。如果哪位大神还有见解可以告诉小弟
个人也是看过之后解决自己问题后写了一个简便的,更多详解请看:/qq_20521573/article/details/52655570
之前添加的文件后来发现可能会出现自动点击了,后来查了一下找到了这个方法
这个方法则是如果不是用户点击的就会返回,如果是则会走else,设定方法if (!()) { return; } else {
}
附上我的adapter的类:(这是我的项目已经删除了隐私部分,没有跑过,所以如果有问题可以私聊我)
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* Created by Administrator on 2017/11/8.
*/
public class SearchAdapter extends BaseAdapter {
private Context context;
private List<HxStockInfo> liveShowData;
LayoutInflater mInflater;
private SQLiteDatabase db;
private RecordSQLiteOpenHelper helper;
private Map<Integer,Boolean> map=new HashMap<>();// 存放已被选中的CheckBox
public SearchAdapter(Context context, List<HxStockInfo> liveShowData) {
= context;
= liveShowData;
mInflater = (context);
= new RecordSQLiteOpenHelper(context);
}
@Override
public int getCount() {
return ();
}
@Override
public Object getItem(int i) {
return (i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int i, View convertView, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = (.hot_search_item_layout, null, false);
viewHolder = new ViewHolder();
= (TextView) (.hot_search_name);
= (TextView) (.hot_search_id);
= (CheckBox) (.hot_search_cb);
(viewHolder);
} else {
viewHolder = (ViewHolder) ();
}
((i).getName());
((i).getCode());
(new () {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked==true){
(i,true);
}else {
(i);
//
}
}
});
return convertView;
}
public class ViewHolder {
TextView name;
TextView id;
public CheckBox cb;
}
}