listview使用checkbox批量删除出现的问题
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批量删除出现的问题的更多相关文章
- repeater 结合checkbox批量删除
项目中用到这个,从网上搜了搜相关内容,代码如下 <script type="text/javascript"> function checkAllThis(obj) { ...
- checkbox批量删除功能
参考:http://www.jb51.net/article/35338.htm 感谢作者 代码片段:jsp <c:forEach items="${infolist }" ...
- vant checkBox 批量删除
有两种实现方式,当然不止两种 一:使用 filter 将我们需要的过滤出来,也就是哪个没有选中就过滤哪个 二:使用splice数组方法,将我们选择需要删除的 index 放到一个数组里面,然后进行删除 ...
- Android 长按Listview显示CheckBox,实现批量删除。
ListView实现的列表,如果是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验很不好,也给用户带来了很大的麻烦. 实现效果图 具体实现代码 select.xml 主布局文件 ...
- WPF Caliburn.Micro ListView 批量删除,有其他方法的大家一起交流一下
做这种批量删除的时候我的想法是获取每行的ID,然后更具ID删除,看过一些博客,大部分都是直接写在.CS文件里面,将ListView和CheckBox关联起来,最后用checkbox ck=sender ...
- 利用ListView批量删除item
利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...
- WPF Caliburn.Micro ListView 批量删除 新方法.高效的
上一片我做的批量删除,是更具ListView的选项改变事件,然后放到一个全局变量里面,缺点已经说了.这次又找到一个好的方法.和大家分享一下.这次我将删除按钮的click事件里面的参数绑定为ListVi ...
- checkbox复选框全选批量删除
多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="Form ...
- Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...
随机推荐
- [读书笔记]了不起的node.js(二)
这周做项目做得比较散(应该说一直都是这样),总结就依据不同情境双开吧-这篇记录的是关于node的学习总结,而下一篇是做项目学到的web前端的知识. 1.HTTP篇 node的HTTP模块在第一篇时接触 ...
- localtime()方法的疑惑
在做一个时间管理的APP中遇到一些问题 windows linux mac下time.h中都有关于localtime()的定义. 它不是一个保险可靠的方法,使用的时候需要小心. 参考 http://b ...
- hdu4587-TWO NODES(割点)
#include <bits/stdc++.h> using namespace std; ; ; struct Edge { int to, next; } edge[M]; int h ...
- Android实例-为程序创建快捷方式(未测试)
结果: 1.因为只有小米手机,没有三星手机,没法测试.如果哪位神测试过的话,记得M我哦,谢了. 实例代码: unit Unit1; interface uses System.SysUtils, S ...
- 删除TreeView节点以及其子节点
//1.删除TreeView节点以及其子节点procedure TForm2.Button1Click(Sender: TObject);var TreeNode:TTreeNode;begin i ...
- 简单OS(ucos超级精简版)——裸调度器【worldsing笔记】
简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述: 1.按最大任务数轮番调度: 2.任务调用延时接口将让出CPU使用权,进入下一个任务调度: 3.用户任务都处于延时或是不使用CPU运行Id ...
- jQuery plugin : jqTransform
Usage 1- Add javascript inclusion in the header section of your web page //required <script type= ...
- CSS背景与列表
CSS中背景的使用 CSS中列表的使用 15.1 CSS中背景的使用 属性名称 属性值 ...
- tomcat+JNDI+spring 的配置问题
在做spring有关的项目时,往往需要配置数据源,当然配置的方式有很多种,可以单独写在一个properties文件中,这样修改数据源配置的话比较容易,也比较简单,下面介绍另外一种数据源的配置 利用jn ...
- ASP.NET购物车实现方法
1.可以参考PetShop中的购物车实现方法 2.[经典示例分享]— 商城购物车设计(VS+Access)附源码 http://www.cnblogs.com/wenyang-rio/archive/ ...