Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选

最近在一个项目中,需要在ListView的item中加入CheckBox,但是遇到的一个问题是上下滑动的时候如果有选择了的CheckBox,就会出现选择项错误的问题,下面将个人的解决方法总结如下; 
先说思路: 
在ListView的Adapter中,用一个Map保存每一项item的选择状态,在getView方法中,设置Map中保存的某一项的选择状态就实现了状态的保存; 
每一项的视图 child.xml

<CheckBox        android:id="@+id/item_cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView        android:id="@+id/item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello" />

Adapter.java 

public class CAdapter extends BaseAdapter {
    private List<String> list;    private LayoutInflater inflater;
    Map<Integer, Boolean> map;    private OnSelectedItemChanged listener;    private Holder holder = null;    public CAdapter(Context context, List<String> list,
            OnSelectedItemChanged listener) {        super();
        inflater = LayoutInflater.from(context);        this.list = list;
        map = new HashMap<Integer, Boolean>();        for (int i = 0; i < list.size(); i++) {
            map.put(i, false);
        }        this.listener = listener;
    }    @Override
    public int getCount() {        return list.size();
    }    @Override
    public Object getItem(int position) {        return list.get(position);
    }    @Override
    public long getItemId(int position) {        return position;
    }    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        String item = list.get(position);        if (view == null) {
            holder = new Holder();
            view = inflater.inflate(R.layout.child, null);
            TextView tv = (TextView) view.findViewById(R.id.item_tv);
            CheckBox cb = (CheckBox) view.findViewById(R.id.item_cb);
            holder.tv = tv;
            holder.cb = cb;
            view.setTag(holder);
        } else {
            holder = (Holder) view.getTag();
            holder.tv.setText(item);
            holder.cb.setChecked(map.get(position));
        }
        holder.tv.setText(list.get(position));        final CheckBox cb = holder.cb;
        cb.setChecked(map.get(position));// 设置选择状态
        cb.setOnClickListener(new OnClickListener() {            @Override
            public void onClick(View v) {
                map.put(position, cb.isChecked());
                listener.selectedItemChange(getSelectedCount(map));
            }
        });        return view;
    }    /**
     * 获取选择的项的数目
     * 
     * @param map
     * @return
     */
    public int getSelectedCount(Map<Integer, Boolean> map) {        int i = 0;        for (Entry<Integer, Boolean> entry : map.entrySet()) {            if (entry.getValue()) {
                i++;
            }
        }        return i;
    }    class Holder {
        TextView tv;
        CheckBox cb;
    }    /**
     * 向Activity暴露选择了多少项
     * 
     * @author cj
     * 
     */
    public interface OnSelectedItemChanged {
        public void selectedItemChange(int count);
    }    public void selectAll() { // 全选
        for (int i = 0; i < list.size(); i++) {
            map.put(i, true);
        }
        notifyDataSetChanged();
    }    public void disSelectAll() { // 全不选
        for (int i = 0; i < list.size(); i++) {
            map.put(i, false);
        }
        notifyDataSetChanged();
    }    public void switchSelect() { // 反选
        for (int i = 0; i < list.size(); i++) {            boolean select = map.get(i);
            map.put(i, !select);
        }
        notifyDataSetChanged();
    }
}

MainActivity.java 

public class MainActivity extends Activity {
    private ListView lv;    private CAdapter adapter;    @Override
    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv);
        setAdapter();

    }    private void setAdapter() {
        List<String> list = new ArrayList<String>();        for (int i = 0; i < 50; i++) {
            list.add("item - " + i);
        }
        adapter = new CAdapter(getApplicationContext(), list,                new OnSelectedItemChanged() {// Adapter接口暴露出来的选择项状态改变时选择的项的数目                    @Override
                    public void selectedItemChange(int count) {
                        Log.e("SelectedCount - ", count + "");
                    }
                });
        lv.setAdapter(adapter);
    }    // 全选
    public void selectAll(View v) {
        adapter.selectAll();
    }    // 全不选
    public void disSelectAll(View v) {
        adapter.disSelectAll();
    }    // 反选
    public void switchSelect(View v) {
        adapter.switchSelect();
    }
}

选择之后反选的效果(右边是点击反选之后的效果): 

在上面用到一个比较好的思想就是用类的内部接口向外部调用类暴露本类的一些状态改变时,外部类可能想要获取的数据信息; 
延伸思考:上面保存的状态是CheckBox,当需要使用RadioButton的时候,使用方法也是类似的; 
但是RadioButton可能会有另一种需求{选择某一项的时候其它项就不选择,也即只选择一项},此种情况其实参考上面全选,反选的实现,实现起来也是比较简单,暂时没时间去写出来测试;

时间: 2024-10-06 09:03:16

Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选的相关文章

Android listview中使用checkbox

最近比较忙碌,我也不知道忙的什么东西,打算写的博客写了一半,还没写完,今天先扯一扯项目中遇到的一个问题,一方面防止以后遇到这个问题忘记如何解决,另一方面希望可以提供给遇到同样问题的朋友一个思路.下面开始正题,在listview的item中使用checkbox,当你按照普通的listview的用法使用时,你会遇到下面这样的问题:1.checkbox可以点击,但是listview的item无法点击2.无法获得checkbox被点击的是哪一行第一个问题涉及到事件分发,下一篇再扯(我会按照我的理解,通俗

android ListView中CheckBox错位的解决

貌似已经很晚了,但是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,可是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并不是你选中的,百思不得其解.后面通过上网查资料,可是个说纷纭,但是我还是找到了解决办法. 在自定义的适配器中,对checkBox的设置如下: 记住两者的顺序,先对checkBox进行事件监听,再设置其状态.前提在布局中对checkBox的状态设为false. android ListView中CheckBox错位的解决,布布扣,bubuko.

android listview中item通过viewpager实现

android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题.本项目由作者Flyco分享的分享地址:https://github.com/H07000223/FlycoBanner_Master.本项目找对应id封装一个ViewFindUtils类,通过如下代码找id    /**

js做全选,用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false

用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false,当所有checkbox都被选中时,全选按钮也被选中. 详解: 有两种方式使<input type="checkbox" />中的复选框被选中. 方法一:直接在HTML行间中添加checked属性.   eg:<input type="checkbox" checked /> 方法二:使用javascript使in

jquery checkbox 复选框多次点击判断选中状态,以及全选/取消的代码示例

2015年12月21日 10:52:51 星期一 目标, 点击当前的checbox, 判断点击后当前checkbox是否是选中状态. html: <input type="checkbox" onclick="contracts_checkall()" id="contracts_checkall"> 全选 js: 1 var checkall = $("#contracts_checkall").attr('ch

解决 listview的item超过屏幕显示出现滚动的全选问题

1.listview的getcount与getchildcount,getcount>=getchildcount.getcount为所有的listdata的size值,getchildcount获得的是显示的值: 当itemsize<=显示屏的显示数量,getcount()=getchildcount(), 当itemsize >显示屏的显示数量,getcount> getchildcount; 2.问题原因: ListView+CheckBox数据超过一屏时数据乱序的原因主要是

如何在Android的ListView中构建CheckBox和RadioButton列表(Android版支持单选和多选的投票项目)

引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本文以一个支持单选和多选投票项目为例,演示了在一个ListView中如何构建CheckBox列表和RadioButton列表,并分析了实现的原理和思路,提供有需要的朋友参考. 项目的演示效果如下. 数据源 通常我们的数据源来自于数据库.首先,我们构建投票项目类SubjectItem. /** * 主题

Android listview在使用checkbox的问题解决方案

最近比较忙碌,我也不知道忙的什么东西,打算写的博客写了一半,还没写完,今天先扯一扯项目中遇到的一个问题,一方面防止以后遇到这个问题忘记如何解决,另一方面希望可以提供给遇到同样问题的朋友一个思路. 下面开始正题,在listview的item中使用checkbox,当你按照普通的listview的用法使用时,你会遇到下面这样的问题: 1.checkbox可以点击,但是listview的item无法点击 2.无法获得checkbox被点击的是哪一行 第一个问题涉及到事件分发,下一篇再扯(我会按照我的理

listview中的checkbox实现全选、反选、删除的功能

1.布局实现的效果 2.找到该布局文件下的所在的activity,实现的效果 package com.bwie.checkbox_all; import java.util.ArrayList; import java.util.Iterator; import com.bwie.adapter.MyAdapter; import com.bwie.vo.User; import android.os.Bundle; import android.app.Activity; import and