Android 选中带有复选框调用的ListView,否则在滚动时同时选中这两个复选框

Android 选中带有复选框调用的ListView,否则在滚动时同时选中这两个复选框,android,listview,checkbox,Android,Listview,Checkbox,您好,我有一个带有复选框的列表视图,我的问题是当我选中复选框并在checkchanged listener中滚动列表时,“ischecked”和“else”都会执行,我想在滚动时,当选中的复选框消失时,它不会保持其状态 我想当我选中复选框(ischecked)时应该调用,当我取消选中复选框“else”时应该调用 这是我的适配器类 public class NamesAdapter extends BaseAdapter { private List<EmployeeModel> em

您好,我有一个带有复选框的列表视图,我的问题是当我选中复选框并在checkchanged listener中滚动列表时,“ischecked”和“else”都会执行,我想在滚动时,当选中的复选框消失时,它不会保持其状态 我想当我选中复选框(ischecked)时应该调用,当我取消选中复选框“else”时应该调用

这是我的适配器类

public class NamesAdapter extends BaseAdapter {
private List<EmployeeModel> employeeModelList;
private Context context;
private EmployeeModel employeeModel;
private ListView listView;
public static String check = "stop";
public String name;
int ii;
int getPosition;
boolean isShowing = false;
public NamesAdapter(List<EmployeeModel> employeeModelList, Context context) {

    this.employeeModelList = employeeModelList;
    this.context = context;


}


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

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

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

@Override
public View getView( int position, View convertView, ViewGroup parent) {

     ViewHolder viewHolder=null;
    if (convertView == null) {
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.empname_listview_model, null);
        viewHolder = new ViewHolder();

        viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkBox);

        convertView.setTag(viewHolder);

        convertView.setTag(R.id.checkBox, viewHolder.checkbox);


    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // Here we get the position that we have set for the checkbox using setTag.
            // Set the value of checkbox to maintain its state.

            //employeeModel = employeeModelList.get(position);

            //name = employeeModel.getName();
            getPosition = (Integer) buttonView.getTag();
            employeeModelList.get(getPosition).setChecked(buttonView.isChecked());

            if (isChecked){
                //getPosition = finalViewHolder.checkbox.getId();
                check="start";
                Toast.makeText(context, "This is if", Toast.LENGTH_SHORT).show();
               displayEmployeeNamesData();

            }
            else {

                check="stop";
                    Toast.makeText(context, "This is else", Toast.LENGTH_SHORT).show();
            }

        }

    });

    viewHolder.checkbox.setTag(position);  // This line is important.
    viewHolder.checkbox.setText(employeeModelList.get(position).getName());
    viewHolder.checkbox.setChecked(employeeModelList.get(position).isChecked());


    return convertView;
}



public void displayEmployeeNamesData() {
    NewEmployeeDBTable newEmployeeDBTable = new NewEmployeeDBTable(context);

    SQLiteDatabase dataBase = newEmployeeDBTable.getWritableDatabase();
    //the SQL command to fetched all records from the table
    String sql = "SELECT eid FROM "
            + NewEmployeeDBTable.EmployeNameTable + " where ename='" + name + "'";
    Cursor mCursor = dataBase.rawQuery(sql, null);
    if (mCursor.moveToFirst()) {
        do {
            ii = mCursor.getInt(mCursor.getColumnIndex(NewEmployeeDBTable.eid));


        }
        while (mCursor.moveToNext());
    }
    mCursor.close();
}


private static class ViewHolder {
    CheckBox checkbox;
}
}
}
公共类名称适配器扩展了BaseAdapter{
私有列表employeeModelList;
私人语境;
私人雇员模式雇员模式;
私有列表视图列表视图;
公共静态字符串检查=“停止”;
公共字符串名称;
int ii;
int-getPosition;
布尔isShowing=false;
公共名称适配器(列表employeeModelList,上下文){
this.employeeModelList=employeeModelList;
this.context=上下文;
}
@凌驾
public int getCount(){
返回employeeModelList.size();
}
@凌驾
公共对象getItem(int i){
//返回employeeModelList.get(i);
返回employeeModelList.get(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder ViewHolder=null;
if(convertView==null){
LayoutInflater LayoutInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
convertView=LayoutFlater.inflate(R.layout.empname\u listview\u model,null);
viewHolder=新的viewHolder();
viewHolder.checkbox=(checkbox)convertView.findViewById(R.id.checkbox);
convertView.setTag(viewHolder);
setTag(R.id.checkBox,viewHolder.checkBox);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.checkbox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//在这里,我们使用setTag获得为复选框设置的位置。
//设置复选框的值以保持其状态。
//employeeModel=employeeModelList.get(位置);
//name=employeeModel.getName();
getPosition=(整数)按钮View.getTag();
get(getPosition).setChecked(buttonView.isChecked());
如果(已检查){
//getPosition=finalViewHolder.checkbox.getId();
check=“开始”;
Toast.makeText(上下文“This is if”,Toast.LENGTH_SHORT).show();
displayEmployeeNamesData();
}
否则{
check=“停止”;
Toast.makeText(上下文“这是其他”,Toast.LENGTH_SHORT).show();
}
}
});
viewHolder.checkbox.setTag(位置);//这一行很重要。
viewHolder.checkbox.setText(employeeModelList.get(position.getName());
viewHolder.checkbox.setChecked(employeeModelList.get(position.isChecked());
返回视图;
}
公共无效显示EmployeeNamesData(){
NewEmployeeDBTable NewEmployeeDBTable=新的NewEmployeeDBTable(上下文);
SQLiteDatabase=newEmployeeDBTable.getWritableDatabase();
//用于从表中获取所有记录的SQL命令
String sql=“从中选择eid”
+NewEmployeeDBTable.EmployeNameTable+“其中ename=”“+name+””;
游标mCursor=dataBase.rawQuery(sql,null);
if(mCursor.moveToFirst()){
做{
ii=mCursor.getInt(mCursor.getColumnIndex(NewEmployeeDBTable.eid));
}
while(mCursor.moveToNext());
}
mCursor.close();
}
私有静态类视图持有者{
复选框;
}
}
}

OnCheckedChangeListener()
将在您单击
复选框或在代码中调用
mCheckBox.setCheck(value)
时调用。
当您在
ListView
上滚动时,
getView()
方法将调用以重新创建
ListView
行,并且在
getView()
中您已经调用了
viewHolder.checkbox.setcheckbox.setChecked(…)
=>OnCheckedChangeListener
调用

要解决这个问题,可以使用
setOnClickListener
like

final EmployeeModel employee = employeeModelList.get(getPosition);
holder.mCheckBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        employee.setChecked(!employee.isChecked());
    }
});
viewHolder.checkbox.setChecked(employee.isChecked());

因为
OnClickListener()
在调用
viewHolder.checkbox.setChecked(…)
OnCheckedChangeListener()
时,或者在代码中调用
mCheckBox.setCheck(value)
时,将调用
OnCheckedChangeListener()

当您在
ListView
上滚动时,
getView()
方法将调用以重新创建
ListView
行,并且在
getView()
中您已经调用了
viewHolder.checkbox.setcheckbox.setChecked(…)
=>OnCheckedChangeListener调用

要解决这个问题,可以使用
setOnClickListener
like

final EmployeeModel employee = employeeModelList.get(getPosition);
holder.mCheckBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        employee.setChecked(!employee.isChecked());
    }
});
viewHolder.checkbox.setChecked(employee.isChecked());

因为调用
onClick Listener()
时不会调用
viewHolder.checkbox.setChecked(…)

我尝试使用onClick Listener,但问题是当我滚动列表时,复选框未选中或选中了其他框automatically@ArslanShahid也许这是另一个问题。你可以在这里查看我的简单演示。使用
setOnClickListener
workwell我尝试使用onClick Listener,但问题是当我滚动列表时,复选框未选中或选中了其他框automatically@ArslanShahid也许这是另一个问题。你可以在这里查看我的简单演示。使用
setOnClickListener
workwell您是否看到复选框状态的随机变化?您能否使用以下术语和信息准确描述?1) 单击第1行复选框并选中此员工2)触摸第5行并向下滚动listview 3)在第5行仍在listview可见集时释放手指-==结果==-现在是否选中第5行?哪一行改变了它的状态?复选框不改变它的位置让我们说如果我选中第一个复选框