Android 滚动时Listview自定义适配器自动调用onCheckChangeListener中的复选框
我用自定义适配器创建了一个listview。它有一个Imageview、textview和一个复选框Android 滚动时Listview自定义适配器自动调用onCheckChangeListener中的复选框,android,checkbox,android-listview,oncheckedchanged,Android,Checkbox,Android Listview,Oncheckedchanged,我用自定义适配器创建了一个listview。它有一个Imageview、textview和一个复选框 --------------------------------------- <ImageView --- textView --- checkbox > --------------------------------------- --------------------------------------- --------------------------------
---------------------------------------
<ImageView --- textView --- checkbox >
---------------------------------------
---------------------------------------
---------------------------------------
我正在使用名为“mCheckStates”的SparseBooleanArray跟踪复选框的状态。我还想限制用户一次只选中两个复选框。为此,我使用了一个int变量作为计数器
但当我在调用checkchangedListener时滚动listView,计数会减少1,有时会减少2,允许用户选中3或4个复选框
我怎样才能阻止这种事情发生?请帮我找到解决办法。谢谢
代码
protected class MyCustomAdapter extends ArrayAdapter<String> implements
CompoundButton.OnCheckedChangeListener {
ArrayList<String> myList;
int count = 0;
ViewHolder holder = null;
public MyCustomAdapter(Context context, int textViewResourceId,
ArrayList<String> sList) {
super(context, textViewResourceId, sList);
mCheckStates = new SparseBooleanArray(sList.size());
myList = sList;
}
private SparseBooleanArray mCheckStates;
private class ViewHolder {
TextView text;
CheckBox chkbox;
ImageView imageview;
}
@Override
public int getCount() {
return stg1.size();
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.new_search_adptr, null);
holder = new ViewHolder();
holder.text = (TextView) convertView
.findViewById(R.id.adapterText1);
holder.chkbox = (CheckBox) convertView
.findViewById(R.id.checkBox1);
holder.imageview = (ImageView) convertView
.findViewById(R.id.imageView1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.chkbox.setTag(position);
holder.chkbox.setChecked(mCheckStates.get(position, false));
holder.chkbox.setOnCheckedChangeListener(this);
holder.text.setText(stg1.get(position).toString());
holder.imageview.setImageBitmap(arr_img.get(position));
return convertView;
}
public boolean isChecked(int position) {
System.out.println("inside isChecked");
return mCheckStates.get(position, false);
}
public void setChecked(int position, boolean isChecked) {
System.out.println("inside setChecked");
mCheckStates.put(position, isChecked);
}
public void toggle(int position) {
System.out.println("inside toggle");
setChecked(position, !isChecked(position));
}
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
System.out.println("\n inside onCheckedChanged: " + isChecked);
if (isChecked) {
System.out.println("inside isChecked true");
System.out.println("count= " + count);
if (count >= 2) {
// count--;
System.out.println("inside count>2: " + count);
buttonView.setChecked(false);
Toast.makeText(getApplicationContext(),
"Please select only two cars!", Toast.LENGTH_LONG)
.show();
} else {
count++;
System.out.println("inside else: " + count);
mCheckStates.put((Integer) buttonView.getTag(), isChecked);
}
} else {
System.out.println("inside isChecked false" + count);
mCheckStates.put((Integer) buttonView.getTag(), isChecked);
count--;
}
}
}
受保护类MyCustomAdapter扩展ArrayAdapter实现
CompoundButton.OnCheckedChangeListener{
ArrayList myList;
整数计数=0;
ViewHolder=null;
公共MyCustomAdapter(上下文,int textViewResourceId,
ArrayList(滑动列表){
super(上下文、textViewResourceId、sList);
mCheckStates=新的SparseBooleanArray(sList.size());
myList=滑动层;
}
专用SparseBooleanArray mCheckStates;
私有类视窗持有者{
文本查看文本;
复选框chkbox;
图像视图图像视图;
}
@凌驾
public int getCount(){
返回stg1.size();
}
@凌驾
公共视图getView(最终整型位置,视图转换视图,
视图组(父级){
if(convertView==null){
LayoutInflater vi=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
convertView=vi.充气(R.布局.新搜索\u adptr,空);
holder=新的ViewHolder();
holder.text=(TextView)convertView
.findViewById(R.id.adapterText1);
holder.chkbox=(复选框)convertView
.findViewById(R.id.复选框1);
holder.imageview=(imageview)convertView
.findViewById(R.id.imageView1);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
支架.chkbox.setTag(位置);
holder.chkbox.setChecked(mCheckStates.get(position,false));
holder.chkbox.setOnCheckedChangeListener(此);
holder.text.setText(stg1.get(position.toString());
holder.imageview.setImageBitmap(arr_img.get(position));
返回视图;
}
已检查公共布尔值(int位置){
System.out.println(“内部已检查”);
返回mCheckStates.get(位置,false);
}
公共void setChecked(int位置,布尔值已检查){
System.out.println(“内部设置检查”);
mCheckStates.put(位置,已检查);
}
公共无效切换(int位置){
System.out.println(“内部切换”);
设置已检查(位置,!已检查(位置));
}
@凌驾
检查更改后的公共无效(复合按钮视图,
布尔值(已检查){
System.out.println(“\n onCheckedChanged内:“+isChecked”);
如果(已检查){
System.out.println(“内部检查为真”);
System.out.println(“count=“+count”);
如果(计数>=2){
//计数--;
System.out.println(“内部计数>2:+计数”);
buttonView.setChecked(假);
Toast.makeText(getApplicationContext(),
“请只选择两辆车!”,祝酒词。长度(长)
.show();
}否则{
计数++;
System.out.println(“其他内部:+count”);
mCheckStates.put((整数)按钮view.getTag(),已选中);
}
}否则{
System.out.println(“内部检查为假”+计数);
mCheckStates.put((整数)按钮view.getTag(),已选中);
计数--;
}
}
}
我假设您的CustomAdapter用于ListView。这就是问题所在,单击单元格进行检查更为方便
因此,您可以在adater本身上设置侦听器:
adapter .setOnItemClickListener();
然后在“活动/片段”中,您实现McClickListener
它将捕获所有单元格的单击,并为您提供单元格在列表中的位置
如果在适配器中使用某个Holder类填充单元格,并将其设置为单元格的标记,则可以在onItemClick方法中获取该Holder:
FiltreCellHolder filtreCellHolder = null;
filtreCellHolder = (FiltreCellHolder) view.getTag();
然后,根据您的全局检查列表,您可以测试此视图是否已选中,并且自从用户单击该视图后,您可以对其进行检查/取消锁定:
filtreCellHolder.cellCheck.setChecked(!filtreCellHolder.cellCheck.isChecked());
adapter.notifyDataSetChanged();
我希望这对你有帮助。请将此代码更改为您的格式
请在“单击”按钮中检查此条件
final int len=thumbnailsselection.length;
int-cnt=0;
字符串selectImages=“”;
路径=新的ArrayList();
对于(int i=0;i5){
Toast.makeText(getApplicationContext(),
“请仅选择5张图片”,Toast.LENGTH(长)
.show();
}else{}
为什么不直接使用onClick()?在onClick()中,它也可能会进入listenerIn getview中,您可以使用setchecked,因此onCheckedChanged被多次调用是正常的。除此之外,GetView可以被调用得太多,您无法控制这一点:我认为使用OnClick()更可靠,所以侦听器应该会出现
public class ImageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public ImageAdapter() {
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void initialize() {
count = myList.size();
thumbnailsselection = new boolean[count];
notifyDataSetChanged();
}
public int getCount() {
return arrPath.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.galleryitem, null);
holder.imageview = (ImageView) convertView
.findViewById(R.id.thumbImage);
holder.checkbox = (CheckBox) convertView
.findViewById(R.id.itemCheckBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.checkbox.setId(position);
holder.imageview.setId(position);
holder.imageview.setAdjustViewBounds(true);
holder.checkbox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v;
int id = cb.getId();
if (thumbnailsselection[id]) {
cb.setChecked(false);
thumbnailsselection[id] = false;
} else {
cb.setChecked(true);
thumbnailsselection[id] = true;
}
}
});
holder.imageview.setImageBitmap(decodeFile(arrPath[position]));
// holder.imageview.setScaleType(ScaleType.FIT_XY);
// holder.imageview.setAdjustViewBounds(true);
holder.checkbox.setChecked(thumbnailsselection[position]);
holder.id = position;
return convertView;
}
}
final int len = thumbnailsselection.length;
int cnt = 0;
String selectImages = "";
path = new ArrayList<String>();
for (int i = 0; i < len; i++) {
if (thumbnailsselection[i]) {
cnt++;
selectImages = arrPath[i];
path.add(selectImages);
}
}
if (cnt == 0) {
Toast.makeText(getApplicationContext(),
"Please select at least one image",
Toast.LENGTH_LONG).show();
} else if (cnt > 5) {
Toast.makeText(getApplicationContext(),
"Please select only 5 images", Toast.LENGTH_LONG)
.show();
} else {}