Android 错误两个复选框在ListView中同时获取检查

Android 错误两个复选框在ListView中同时获取检查,android,baseadapter,android-checkbox,Android,Baseadapter,Android Checkbox,我正在使用带有复选框的列表视图。我的问题有点奇怪,每当我检查列表视图中的任何项目时,另一个项目也会被检查。我正在setOnCheckedChangeListener事件上的HashMap中存储选中项的ID。我记录了HashMap结果,它存储在那些被点击的条目ID上,而不是随机检查的条目ID上 我真的需要你的帮助 这是我的BaseAdapter代码: public class StrengthOfDemandAdapter extends BaseAdapter { ArrayList&l

我正在使用带有复选框的
列表视图
。我的问题有点奇怪,每当我检查
列表视图中的任何项目时,另一个项目也会被检查。我正在
setOnCheckedChangeListener
事件上的
HashMap
中存储选中项的ID。我记录了
HashMap
结果,它存储在那些被点击的条目ID上,而不是随机检查的条目ID上

我真的需要你的帮助

这是我的BaseAdapter代码:

public class StrengthOfDemandAdapter extends BaseAdapter {
    ArrayList<Products> list;
    //private LayoutInflater layoutInflater;
    private static HashMap<Integer, String> selectedSODBrandsMap = new HashMap<Integer, String>();
    private SQLiteDatabase database;
    private SQLiteOpenHelper dbHelper;
    //private static ArrayList<String> selectSODBRandNames = new ArrayList<String>();
    private Context con;
    private int imageNo;

    public StrengthOfDemandAdapter(Context context, ArrayList<Products> list, int imageNumber) {
        this.list = list;
        this.con = context;
        this.imageNo = imageNumber;
        //layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        dbHelper = new DBHelper(con);
        database = dbHelper.getWritableDatabase();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View convertView, ViewGroup viewGroup) {
        View v = convertView;
        final ViewHolder mHolder;

        //Log.i("SIZE", "getView: "+list.size());
        if(v == null){
            //Log.i("INFO 2", "openDialog: "+((Products)list.get(i)).getProductID()+", "+((Products)list.get(i)).getProductName());
            LayoutInflater vi = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.strengthofdemandlistview, null);
            mHolder = new ViewHolder();

            mHolder.mCheckBox = (CheckBox) v.findViewById(R.id.SODCheckBox);


            v.setTag(mHolder);
        }else {
            mHolder = (ViewHolder) v.getTag();
            //mHolder.mCheckBox.setOnCheckedChangeListener(null);
        }
        //mHolder.mCheckBox.setFocusable(false);
        mHolder.mCheckBox.setText(((Products)list.get(i)).getProductName());
        mHolder.mCheckBox.setTag(((Products)list.get(i)).getProductID());

        mHolder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    //Log.i("YES", "onCheckedChanged: YES"+((Products)list.get(i)).getProductName());
                    selectedSODBrandsMap.put(((Products)list.get(i)).getProductID(), ((Products)list.get(i)).getProductName());
                }else {
                    //Log.i("NO", "onCheckedChanged: NO"+((Products)list.get(i)).getProductName());
                    selectedSODBrandsMap.remove(((Products)list.get(i)).getProductID());
                }
            }
        });


        return v;
    }

    private class ViewHolder {
        private CheckBox mCheckBox;

    }

    public static HashMap<Integer, String> sendSelectedSODBrandsMap(){
        return selectedSODBrandsMap;
    }

}
DemandAdapter扩展BaseAdapter的公共类强度{
数组列表;
//私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
私有静态HashMap selectedSODBrandsMap=newhashmap();
专用数据库;
私有SQLiteOpenHelper-dbHelper;
//私有静态ArrayList selectSODBRandNames=new ArrayList();
私人语境;
私人int imageNo;
DemandAdapter的公共强度(上下文上下文、ArrayList列表、int imageNumber){
this.list=列表;
this.con=上下文;
this.imageNo=imageNumber;
//layoutInflater=(layoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
dbHelper=新的dbHelper(con);
database=dbHelper.getWritableDatabase();
}
@凌驾
public int getCount(){
返回list.size();
}
@凌驾
公共对象getItem(int i){
返回列表。获取(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
公共视图getView(最终int i、视图转换视图、视图组视图组){
视图v=转换视图;
最终持票人;
//Log.i(“SIZE”,“getView:+list.SIZE());
如果(v==null){
//Log.i(“信息2”,“openDialog:”+((产品)列表.get(i)).getProductID()+,“+((产品)列表.get(i)).getProductName());
LayoutInflater vi=(LayoutInflater)con.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=vi.充气(R.布局.强度为DemandListView,空);
mHolder=新的ViewHolder();
mHolder.mCheckBox=(复选框)v.findviewbyd(R.id.SODCheckBox);
v、 setTag(mHolder);
}否则{
mHolder=(ViewHolder)v.getTag();
//mHolder.mCheckBox.setOnCheckedChangeListener(null);
}
//mHolder.mCheckBox.setFocusable(false);
mHolder.mCheckBox.setText(((产品)列表.get(i)).getProductName();
mHolder.mCheckBox.setTag(((产品)列表.get(i)).getProductID();
mHolder.mCheckBox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
//Log.i(“YES”,“onCheckedChanged:YES”+((产品)列表.get(i)).getProductName();
selectedSODBrandsMap.put(((产品)列表.get(i)).getProductID(),((产品)列表.get(i)).getProductName();
}否则{
//Log.i(“否”,“onCheckedChanged:NO”+((产品)列表.get(i)).getProductName();
selectedSODBrandsMap.remove(((产品)列表.get(i)).getProductID());
}
}
});
返回v;
}
私有类视窗持有者{
专用复选框mCheckBox;
}
公共静态哈希映射sendSelectedSODBrandsMap(){
返回所选的品牌地图;
}
}

发生这种情况是因为listview回收机制

将适配器代码更改为

public class StrengthOfDemandAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {

    private SparseBooleanArray mCheckStates;
    ArrayList<Products> list;
    //private LayoutInflater layoutInflater;
    private static HashMap<Integer, String> selectedSODBrandsMap = new HashMap<Integer, String>();
    private SQLiteDatabase database;
    private SQLiteOpenHelper dbHelper;
    //private static ArrayList<String> selectSODBRandNames = new ArrayList<String>();
    private Context con;
    private int imageNo;

    public StrengthOfDemandAdapter(Context context, ArrayList<Products> list, int imageNumber) {
        this.list = list;
        this.con = context;
        this.imageNo = imageNumber;
        //layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        dbHelper = new DBHelper(con);
        database = dbHelper.getWritableDatabase();
        mCheckStates = new SparseBooleanArray(list.size());
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View convertView, ViewGroup viewGroup) {
        View v = convertView;
        final ViewHolder mHolder;

        //Log.i("SIZE", "getView: "+list.size());
        if(v == null){
            //Log.i("INFO 2", "openDialog: "+((Products)list.get(i)).getProductID()+", "+((Products)list.get(i)).getProductName());
            LayoutInflater vi = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.strengthofdemandlistview, null);
            mHolder = new ViewHolder();

            mHolder.mCheckBox = (CheckBox) v.findViewById(R.id.SODCheckBox);


            v.setTag(mHolder);
        }else {
            mHolder = (ViewHolder) v.getTag();
            //mHolder.mCheckBox.setOnCheckedChangeListener(null);
        }
        //mHolder.mCheckBox.setFocusable(false);

        Product product = getItem(i);
        mHolder.mCheckBox.setText(product.getProductname());
        holder.mCheckBox.setTag(position);
        holder.mCheckBox.setChecked(mCheckStates.get(position, false));
        holder.mCheckBox.setOnCheckedChangeListener(this);

        return v;
    }

    private class ViewHolder {
        private CheckBox mCheckBox;

    }

   public boolean isChecked(int position) {
        return mCheckStates.get(position, false);
    }

    public void setChecked(int position, boolean isChecked) {
        mCheckStates.put(position, isChecked);

    }

    public void toggle(int position) {
        setChecked(position, !isChecked(position));

    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
                                 boolean isChecked) {

        mCheckStates.put((Integer) buttonView.getTag(), isChecked);

    }

    public static HashMap<Integer, String> sendSelectedSODBrandsMap(){
        return selectedSODBrandsMap;
    }

}
公共类增强DemandAdapter扩展BaseAdapter实现CompoundButton.OnCheckedChangeListener{
专用SparseBooleanArray mCheckStates;
数组列表;
//私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
私有静态HashMap selectedSODBrandsMap=newhashmap();
专用数据库;
私有SQLiteOpenHelper-dbHelper;
//私有静态ArrayList selectSODBRandNames=new ArrayList();
私人语境;
私人int imageNo;
DemandAdapter的公共强度(上下文上下文、ArrayList列表、int imageNumber){
this.list=列表;
this.con=上下文;
this.imageNo=imageNumber;
//layoutInflater=(layoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
dbHelper=新的dbHelper(con);
database=dbHelper.getWritableDatabase();
mCheckStates=newsparsebooleanarray(list.size());
}
@凌驾
public int getCount(){
返回list.size();
}
@凌驾
公共对象getItem(int i){
返回列表。获取(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
公共视图getView(最终int i、视图转换视图、视图组视图组){
视图v=转换视图;
最终持票人;
//Log.i(“SIZE”,“getView:+list.SIZE());
如果(v==null){
//Log.i(“信息2”,“openDialog:”+((产品)列表.get(i)).getProductID()+,“+((产品)列表.get(i)).getProductName());
LayoutInflater vi=(LayoutInflater)con.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=vi.充气(R.布局.强度为DemandListView,空);
mHolder=新的ViewHolder();
mHolder.mCheckBox=(复选框)v.findviewbyd(R.id.SODCheckBox);
v、 setTag(mHolder);
}否则{
mHolder=(ViewHolder)v.getTag();
//mHolder.mCheckBox.setOnCheckedChangeListener(null);
}
//mHolder.mCheckBox.setFocusable(false);
产品=获取项目(i);
mHolder.mCheckBox.setText(product.getProductname());
支架.mCheckBox.setTag(位置);
holder.mCheckBox.setChecked(mCheckStates.get(position,false));
holder.mCheckBox.setOnCheckedChangeListener(此);
返回v;
}
私有类视窗持有者{
私人支票