使用 setOnCheckedChangeListener 的复选框持有者
Checkbox holder using setOnCheckedChangeListener
我正在尝试制作一个带有复选框的列表视图,我已经尝试了一个代码并且它工作正常但是我在尝试处理复选框状态时遇到了问题。问题出现在这行代码
holder.chkBox.setOnCheckedChangeListener((MyActivity) context);
因为我试过的代码使用的是与 MainActivity.java 文件分开的 Adapter.java 文件,但是在我的代码中所有文件都在一个文件中,所以我不知道如何在我的代码,我已经试过了
holder.chkBox.setOnCheckedChangeListener((this) context);
也是一个错误的说法
使用这行 holder 的原因是当我选中一个复选框并向下滚动其他项目时,选中的复选框会自动取消选中,谁能告诉我如何解决这个问题?
这是我的适配器代码
@Override public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
View itemView = convertView;
if (itemView == null){
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.textView1 = (TextView) itemView.findViewById(R.id.textView1);
holder.check1 = (CheckBox) itemView.findViewById(R.id.check1);
holder.check2 = (CheckBox) itemView.findViewById(R.id.check2);
itemView.setTag(holder);
}
else{
holder = (ViewHolder) itemView.getTag();
}
holder.check1.setTag(position);
final Item item = items.get(position);
holder.textView1.setText(item.getName());
holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(buttonView.isPressed()){
if (position != ListView.INVALID_POSITION) {
Item p = items.get(position);
p.setSelected(isChecked);
}
}
}
}
);
holder.check2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(buttonView.isPressed()){
if (position != ListView.INVALID_POSITION) {
Item p = items.get(position);
p.setSelected(isChecked);
}
}
}
}
);
holder.check1.setChecked(item.isSelected());
holder.check2.setChecked(item.isSelected());
return itemView;
}
}private static class ViewHolder {
public TextView textView1;
public CheckBox check2,check1;
}}
看起来在您使用的示例代码中,您的 activity 实现了 OnCheckedChangeListener,因此您需要传递上下文。在您的适配器中,您可以按如下方式进行:
holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
// logic
}
}
);
在您运行它的代码中,您的 activity 中可能有一个重写的 onCheckedChanged 方法。将上面的逻辑移到我有 // 逻辑的地方。
首先,让您的 activity 实现 OnCheckedChangedListener
接口,这会强制实现以下方法:
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
}
现在将您的 activity 的引用作为 OnCheckedChangeListener 类型的参数传递给您的适配器,并将其命名为侦听器:
MyAdapter myadapter = new MyAdapter(context, MyActivity.this,listdata);
然后,在您的适配器 class 中,为您的复选框设置侦听器,例如:
holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(buttonView.isPressed()){
//Write the logic to determine if the checkbox must be checked or not
}
}
}
);
这里的重点是使用复选框的isPressed()方法
我正在尝试制作一个带有复选框的列表视图,我已经尝试了一个代码并且它工作正常但是我在尝试处理复选框状态时遇到了问题。问题出现在这行代码
holder.chkBox.setOnCheckedChangeListener((MyActivity) context);
因为我试过的代码使用的是与 MainActivity.java 文件分开的 Adapter.java 文件,但是在我的代码中所有文件都在一个文件中,所以我不知道如何在我的代码,我已经试过了
holder.chkBox.setOnCheckedChangeListener((this) context);
也是一个错误的说法
使用这行 holder 的原因是当我选中一个复选框并向下滚动其他项目时,选中的复选框会自动取消选中,谁能告诉我如何解决这个问题?
这是我的适配器代码
@Override public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
View itemView = convertView;
if (itemView == null){
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.textView1 = (TextView) itemView.findViewById(R.id.textView1);
holder.check1 = (CheckBox) itemView.findViewById(R.id.check1);
holder.check2 = (CheckBox) itemView.findViewById(R.id.check2);
itemView.setTag(holder);
}
else{
holder = (ViewHolder) itemView.getTag();
}
holder.check1.setTag(position);
final Item item = items.get(position);
holder.textView1.setText(item.getName());
holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(buttonView.isPressed()){
if (position != ListView.INVALID_POSITION) {
Item p = items.get(position);
p.setSelected(isChecked);
}
}
}
}
);
holder.check2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(buttonView.isPressed()){
if (position != ListView.INVALID_POSITION) {
Item p = items.get(position);
p.setSelected(isChecked);
}
}
}
}
);
holder.check1.setChecked(item.isSelected());
holder.check2.setChecked(item.isSelected());
return itemView;
}
}private static class ViewHolder {
public TextView textView1;
public CheckBox check2,check1;
}}
看起来在您使用的示例代码中,您的 activity 实现了 OnCheckedChangeListener,因此您需要传递上下文。在您的适配器中,您可以按如下方式进行:
holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
// logic
}
}
);
在您运行它的代码中,您的 activity 中可能有一个重写的 onCheckedChanged 方法。将上面的逻辑移到我有 // 逻辑的地方。
首先,让您的 activity 实现 OnCheckedChangedListener
接口,这会强制实现以下方法:
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
}
现在将您的 activity 的引用作为 OnCheckedChangeListener 类型的参数传递给您的适配器,并将其命名为侦听器:
MyAdapter myadapter = new MyAdapter(context, MyActivity.this,listdata);
然后,在您的适配器 class 中,为您的复选框设置侦听器,例如:
holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(buttonView.isPressed()){
//Write the logic to determine if the checkbox must be checked or not
}
}
}
);
这里的重点是使用复选框的isPressed()方法