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;    }}
时间: 2024-12-28 01:27:26

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

repeater 结合checkbox批量删除

项目中用到这个,从网上搜了搜相关内容,代码如下 <script type="text/javascript"> function checkAllThis(obj) { var aa = document.getElementsByTagName("input"); for (var i = 0; i < aa.length; i++) { var e = aa[i]; if ((e.type == 'checkbox')) { var o = e

vant checkBox 批量删除

有两种实现方式,当然不止两种 一:使用 filter 将我们需要的过滤出来,也就是哪个没有选中就过滤哪个 二:使用splice数组方法,将我们选择需要删除的 index 放到一个数组里面,然后进行删除. splice有一个坑(splice会改变原数组) 先说说方法一: /* 假设我们是依赖这个数据来进行渲染,v-for="(item,index) in addressList" 使用filter 的话我们可以给每一个对象添加一个key值isDel ,你在增加的一个人时也只需要push

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

Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义adapter的使用方法.加了非常多的推断等等等等-.我们先来看看实现的效果吧! 好的,我们新建一个项目LvCheckBox 我们事先先把这两个布局写好吧,一个是主布局,另一个listview的item.xml.相信不用多说 activity_main.xml <LinearLayout xmlns:

checkbox复选框全选批量删除

多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="FormName" onsubmit="return checkbox();"> <table > <tr ><td><input type="checkbox" name="checkboxes[]"

5月21 汽车查询及批量删除----php方法

---恢复内容开始--- 这个与之前不同是在php中实现了页面的查询,引用AJAX实现批量删除及弹窗的显示 作业要求: 页面显示数据代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.or

使用easyui实现列表的批量删除

使用easyui实现列表的批量删除 首先要做的就是添加一个多选框 <table id="otGrid" nowrap="false" style="height: 330px;"> <thead> <tr> <th data-options="checkbox:true"></th> //就是这个,多选框 在列表的配置选项中 添加一个 singleSelect:fal

删除JS前台校验,后台批量删除

1.功能需求 在一个数据表格中,选中欲删除的记录,点击删除按钮,先触发前台验证,然后调用后台处理逻辑 2.代码实现 HTML代码: <asp:Repeater ID="repInputList" runat="server" DataSourceID="InputsDataSource" EnableViewState="true" > <HeaderTemplate> <table cellpa

PHP数据访问批量删除(10261101)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

作业:汽车查询--弹窗显示详情,批量删除 ajax做法(0521)

作业:显示以下界面: 作业要求: 1.查看详细信息,以弹窗的形式显示,使用ajax2.批量删除 一.主页面 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml