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. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  2. android中setOnClickListener的那点事

    最近在写代码中,发现在xml文件设置了android:clickable="false",之后这个View还是可点的. 后来发现,是代码中对View设置了监听事件(setOnCli ...

  3. MySQL Workbench 导出数据库脚本(图文)

    1.如下图红框所示,在Server Administration那里,点击"New Server Instance" 2.如下图所示,如果是连接本地数据库,则选localhost, ...

  4. Android实例-程序界面内截取屏幕(XE8+小米2)

    结果: 1.只能截取程序界面内的图片. 2.图片有点不清楚,自己设置清楚度. 实例代码: unit Unit1; interface uses System.SysUtils, System.Type ...

  5. 转载 VPN介绍

    转载原地址:  http://aajs800.blog.51cto.com/519255/239724  原作者 aajs800 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...

  6. Countly在andoid和vps集成使用,开源的统计分析sdk

    这几天项目需要,简单研究了一下countly,说实话完全满足项目需要,比umeng这类产品干净多了. Countly Mobile Analytics 下面就讲一下android 集成的过程,以及 服 ...

  7. Swift 基本语法2

    一.?和! 1.可选类型: ? 在swift中,可选类型(?)其根源是一个枚举型,里面有None和Some两种类型.其实所谓的nil就是Optional.None, 非nil就是Optional.So ...

  8. 第一个android程序所遇到问题

    1.工程package的命名空间与activity的命名空间不一致,导致setcontentview找不到layout文件 2.增加Button等控件后,Java.R中id必须在删除现有Java.R文 ...

  9. Stage3D学习笔记(一):3D术语简介

    网格(Mesh) 3D中,所有可见的模型都被称作网格.网格是由3DMax等建模软件制作,定义了一个3D物体的形状.一个网格是由多个多边形组成的. 多边形(Polygon) 一个多边形是组成网格的一个最 ...

  10. SQL Server 127个SQL server热门资料汇总

      SQL Server 127个SQL server热门资料汇总     最近有许多关于如何学习SQLSERVER的问题,其实新手入门的资源和贴子很多,现在向大家隆重推荐经过精心整理的[SQLSer ...