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. $GLOBALS 添加超全局变量

    <?php function test() { $foo = "local variable"; echo '$foo in global scope: ' . $GLOBA ...

  2. Google的IP地址一览表,加上代理服务器

    Bulgaria 93.123.23.1 93.123.23.2 93.123.23.3 93.123.23.4 93.123.23.5 93.123.23.6 93.123.23.7 93.123. ...

  3. light oj 1138 - Trailing Zeroes (III)【规律&&二分】

    1138 - Trailing Zeroes (III)   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit:  ...

  4. hdoj 1863 畅通工程

    并查集+最小生成树 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. sql2008_x64 读取excel

    sql2008_x64 读取excel 下载64bit 版的AccessDatabaseEngine_x64:http://www.microsoft.com/en-us/download/detai ...

  6. 知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题

    我们知道在为sqlserver建立功能数据库时,通过会为库再建立一个登陆名,而这个登陆名时,只用来管理这个数据库,这是安全的,正确的.

  7. JavaScript要点(十) HTML DOM - 改变 HTML

    HTML DOM 允许 JavaScript 改变 HTML 元素的内容. A.改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu Oct 13 2 ...

  8. android的进度条使用

    android的进度条 1.实现的效果 2.布局代码 先写一个my_browser.xml文件 存放WebView <?xml version="1.0" encoding= ...

  9. procps工具集 ----Linux中的可用内存指的是什么?

    https://gitlab.com/procps-ng/procps free - Report the amount of free and used memory in the system k ...

  10. javascript中的 "=="

    对象之间比较比较的是引用地址 对象和其他比较,转成字符串 字符串和数字比较,字符串转成数字 布尔值和任何比较,转成数字 undefined == null NaN 和谁都不相等 javascript权 ...