1.选中前面的checkbox导致后的checkbox被选中

2.选中后下滑listview,再上滑时被选中的checkbox又变成未选中状态。

问题大都是因为对listview进行代码优化重用convertView导致的。

解决方法:

package se08.edu.com.example.hxdn.softwareengineeringdate;

import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* Created by hxdn on 2015/9/27.
*/
class MyAdapter extends BaseAdapter {
private Context mcontext;
private int pagesize=15;
private int page=1;
private LayoutInflater inflater=null;
private Person person[];
// private static ArrayList<String> selected;
private Map<Integer,String> selected;
public MyAdapter(Context c,Person p[],int page,int pagesize)
{
this.mcontext=c;
this.person=p;
this.page=page;
this.pagesize=pagesize;
this.inflater=LayoutInflater.from(c);
selected = new HashMap<Integer,String>();
}
public Map<Integer,String> getSelected()
{
return selected;
}
@Override
public int getCount() {
int c=(page-1)*pagesize;
if (person.length-c<pagesize)
{
return person.length-c;
}
else
{
return pagesize;
} } @Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position)
{
return position;
} @Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=null;
selected = new HashMap<Integer,String>();
if (convertView==null)
{
viewHolder=new ViewHolder();
convertView=inflater.inflate(R.layout.simple_item,parent,false);
viewHolder.iv=(ImageView)convertView.findViewById(R.id.iv);
viewHolder.name=(TextView)convertView.findViewById(R.id.name);
viewHolder.majorId=(TextView)convertView.findViewById(R.id.majorId);
viewHolder.tel=(TextView)convertView.findViewById(R.id.tel);
viewHolder.cb=(CheckBox)convertView.findViewById(R.id.check);
convertView.setTag(viewHolder);
}
else
{ viewHolder=(ViewHolder)convertView.getTag();
}
viewHolder.cb.setTag(position + pagesize * (page - 1));//设置标签
if (selected.containsKey(position + pagesize * (page - 1)))
//判断listview的item上的checkbox是否被选中,用position+pagesize*(page-1)作为唯一标识
{
viewHolder.cb.setChecked(true);
}
else
{
viewHolder.cb.setChecked(false);
}
if (MainActivity.editModel)
{
viewHolder.cb.setVisibility(View.VISIBLE);
}
else
{
viewHolder.cb.setVisibility(View.GONE);
}
viewHolder.iv.setImageResource(person[position + pagesize * (page - 1)].getImageId());
viewHolder.name.setText(person[position + pagesize * (page - 1)].getName());
viewHolder.tel.setText(person[position + pagesize * (page - 1)].getTel());
viewHolder.majorId.setText(person[position + pagesize * (page - 1)].getMajorId());
viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
//OnCheckChangedListener监听CheckBox的状态,无论来自你的onClick事件还是其他。
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
{
if(!selected.containsKey(buttonView.getTag()))
//前面代码进行优化,会对converView进行复用,所以会导致当前面一个checkbox被选中后面的checkbox也被选中
//于是进行判断,如果selectd没有这个key值,则加入到selectd中
//之前出现的问题是当我选中第一个checkbox,第十二个也会被选中
// 加了这个判断后,即使第十二checkbox是因为复用converView导致被选中的,但selectd的key值已经包含了
//这个信息,selectd便不会将其加入。
//在前面用selectd进行判断的时候便会把第十二checkbox设置为false;
selected.put((Integer) buttonView.getTag(),person[position + pagesize * (page - 1)].getMajorId());
MainActivity.txtcount.setText("共选中:" + selected.size());
}
else
{
selected.remove((Integer) buttonView.getTag());
MainActivity.txtcount.setText("共选中:" + selected.size());
}
}
});
return convertView;
}
public class ViewHolder
{
private ImageView iv;
private TextView name;
private TextView majorId;
private TextView tel;
CheckBox cb;
}
}

listview使用checkbox批量删除出现的问题的更多相关文章

  1. repeater 结合checkbox批量删除

    项目中用到这个,从网上搜了搜相关内容,代码如下 <script type="text/javascript"> function checkAllThis(obj) { ...

  2. checkbox批量删除功能

    参考:http://www.jb51.net/article/35338.htm 感谢作者 代码片段:jsp <c:forEach items="${infolist }" ...

  3. vant checkBox 批量删除

    有两种实现方式,当然不止两种 一:使用 filter 将我们需要的过滤出来,也就是哪个没有选中就过滤哪个 二:使用splice数组方法,将我们选择需要删除的 index 放到一个数组里面,然后进行删除 ...

  4. Android 长按Listview显示CheckBox,实现批量删除。

    ListView实现的列表,如果是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验很不好,也给用户带来了很大的麻烦. 实现效果图 具体实现代码 select.xml 主布局文件 ...

  5. WPF Caliburn.Micro ListView 批量删除,有其他方法的大家一起交流一下

    做这种批量删除的时候我的想法是获取每行的ID,然后更具ID删除,看过一些博客,大部分都是直接写在.CS文件里面,将ListView和CheckBox关联起来,最后用checkbox ck=sender ...

  6. 利用ListView批量删除item

    利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...

  7. WPF Caliburn.Micro ListView 批量删除 新方法.高效的

    上一片我做的批量删除,是更具ListView的选项改变事件,然后放到一个全局变量里面,缺点已经说了.这次又找到一个好的方法.和大家分享一下.这次我将删除按钮的click事件里面的参数绑定为ListVi ...

  8. checkbox复选框全选批量删除

    多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="Form ...

  9. Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能

    Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...

随机推荐

  1. Android下NFC的简单使用

    现在很多手机已经配备了NFC(Near Field Communication 近场通信)的功能,我就为此专门研究过,可以到本文末尾下载源代码. Android官方资料:http://develope ...

  2. 40个Java集合面试问题和答案

    Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 另外,码农网之前也整理过一篇关于Java集合面试题的文章:大公司最 ...

  3. 第十一章、认识与学习 BASH 数据流重导向

    数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据 ...

  4. ios开发 json数据文件的存取

    将Json存进本地文件夹     NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomai ...

  5. 【STL源码学习】细品vector

    第一节:vector简介 vector是一种典型的类模板,使用的时候必须进行实例化. vector的数据存储在数组上,支持随机访问迭代器,支持下标操作[]和at操作,支持手动扩容和自动容量增长. ve ...

  6. MySQL订单分库分表多维度查询

    转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询  MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...

  7. Struts2中的session、request、respsonse获取方法

    个人对于struts有一种复杂的心情,平心而论,struts2是个人最早接触到的的框架,在学校的时候就已经开始学习了,大四毕业设计,无疑用的还是struct,那时候SSH还是很流行的,后来出来实习,直 ...

  8. .NET常用操作小知识

    一..NET截取指定长度汉字超出部分以“.....”表示 /// <summary> /// 将指定字符串按指定长度进行剪切, /// </summary> /// <p ...

  9. 关于PKCS5Padding与PKCS7Padding的区别

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. 如何用JAVA生成注册序列号

    原文:http://blog.csdn.net/eagleking012/article/details/7099900 平常我们都接触过软件注册,输入序列号.激活码.注册码.授权码:对于这些字符码到 ...