向下滚动时,CheckBox会自动取消选中 这是我的以下代码:
package com.serial.teach;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class TeachAdapter extends ArrayAdapter<String> {
Context context;
ArrayList<String> roll =new ArrayList<String>();
ArrayList<String> checkbox=new ArrayList<String>();
private int lastPosition = -1;
private int counter = 0;
ArrayList<Boolean> status = new ArrayList<Boolean>();
public static List<Integer> SelectedBox = new ArrayList<Integer>();
Animation animation;
View row;
public TeachAdapter(Context c,ArrayList<String> r, ArrayList<String> ch) {
super(c, R.layout.single_rows, R.id.name, ch);
// TODO Auto-generated constructor stub
this.context = c;
this.roll = r;
this.checkbox = ch;
for (int i = 0; i < roll.size(); i++) {
status.add(false);
}
}
class MyViewHolder {
TextView tv;
CheckBox cb;
public MyViewHolder(View v) {
// TODO Auto-generated constructor stub
tv = (TextView) v.findViewById(R.id.roll);
cb = (CheckBox) v.findViewById(R.id.name);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
row = convertView;
final MyViewHolder holder;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.single_rows, parent, false);
holder = new MyViewHolder(row);
row.setTag(holder);
} else {
holder = (MyViewHolder) row.getTag();
}
animation = AnimationUtils.loadAnimation(getContext(),
(position > lastPosition) ? R.anim.up_from_bottom
: R.anim.abc_fade_in);
//down_from_top
row.startAnimation(animation);
lastPosition = position;
holder.tv.setText(roll.get(position));
holder.cb.setText(checkbox.get(position));
holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if (holder.cb.isChecked()) {
status.set(position, true);
SelectedBox.add(Integer.parseInt((roll.get(position))));
Toast.makeText(getContext(), "You selected " + roll.get(position)+" "+ checkbox.get(position),
Toast.LENGTH_SHORT).show();
holder.cb.setTextColor(Color.rgb(0, 255, 0));
} else {
status.set(position, false);
Toast.makeText(getContext(), "You unchecked " + position,
Toast.LENGTH_SHORT).show();
holder.cb.setTextColor(Color.rgb(255, 0, 0));
}
}
});
holder.cb.setChecked(status.get(position));
holder.cb.setTag(position);
return row;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return super.getCount();
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return super.getItem(position);
}
}
我有一个textView和一个像这样的复选框:
TV |_|Checkbox
TV |_|Checkbox
TV |_|Checkbox
TV |_|Checkbox
TV |_|Checkbox
但是对于许多项目,当我选择自动取消选择时。
我的布局包含一个textView和一个CheckBox,如上所述
答案 0 :(得分:0)
列表元素由适配器中的getView()
函数查看,当它们出现在屏幕的可见部分时会重新生成。您的复选框可能会被选中,但当它退出屏幕时,此信息将被回收。当它再次出现在屏幕中时,getView()
方法再次起作用,并且显示为未选中。但是,这只是外观,这意味着,您在后台制作的与checkBox相关的任何编程算法仍然有效。如果你想保留checkBoxes的外观,你应该保留一个包含状态的布尔值列表。
例如,创建一个布尔列表checkedBefore
。在每个checkBox操作中相应地填写此列表。 position
方法中的getView()
参数是列表中的索引。然后,您可以使用以下代码每次都正确显示复选框;
if( checkedBefore(position) ){
checkBox.setChecked(true);
}
答案 1 :(得分:0)
这是因为一次又一次地调用getview。为了防止它,你必须保留复选框的状态。THIS链接帮助了我,它也会帮助你。这是最好的解决方案 我发现。我无法粘贴代码,因为它太大了。它是关于这个问题的完整博客