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