• 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;
    }
    }
  • 相关阅读:
    cocos2d-3.0 Helloworld::onTouchMoved的处理机制的推測
    一个Nodejs的简单计算測试程序
    js正則表達式语法
    奇妙的go语言(网页下载)
    java环境变量配置
    【数据结构与算法】二叉树深度遍历(非递归)
    $.each 和$(selector).each()的差别
    HDU-2844-Coins(多重背包)
    curl命令具体解释
    Arduino 数码管LED屏驱动
  • 原文地址:https://www.cnblogs.com/hsshy/p/4908751.html
Copyright © 2020-2023  润新知