ListView + CheckBox实现单选、多选效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/darling_R/article/details/54947377

转载请注明出处:http://blog.csdn.net/darling_R/article/details/54947377
本文出自:哎呀小嘿的博客

还是先来看看是不是你想要的效果:
这里写图片描述

不废话,直接上代码,很简单,代码里都有注释

1 单选

public class SingleActivity extends AppCompatActivity {
    private ListView listView;
    private ArrayList<String> groups;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single);
        listView = (ListView) this.findViewById(R.id.lvGroup);
        groups = new ArrayList<String>();
        groups.add("11");
        groups.add("22");
        groups.add("33");
        groups.add("44");
        groups.add("55");
        groups.add("66");
        groups.add("77");
        AdapterView.OnItemClickListener listItemClickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤
                SingleAdapter.ViewHolder viewHolder = (SingleAdapter.ViewHolder) view.getTag();
                viewHolder.cb.toggle();// 把CheckBox的选中状态改为当前状态的反,gridview确保是单一选中
            }
        };
        SingleAdapter adapter = new SingleAdapter(this, groups);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(listItemClickListener);
    }
}

Adapter:

public class SingleAdapter extends BaseAdapter {
    private Activity activity;//上下文
    private ArrayList<String> list;
    private LayoutInflater inflater = null;//导入布局
    private int temp = -1;

    public SingleAdapter(Activity context, ArrayList<String> list) {
        this.activity = context;
        this.list = list;
        inflater = LayoutInflater.from(context);
    }

    @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;
    }

    //listview每显示一行数据,该函数就执行一次
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {//当第一次加载ListView控件时  convertView为空
            convertView = inflater.inflate(R.layout.group_item_view, null);//所以当ListView控件没有滑动时都会执行这条语句
            holder = new ViewHolder();
            holder.tv = (TextView) convertView.findViewById(R.id.item_tv);
            holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);
            convertView.setTag(holder);//为view设置标签
        } else {//取出holder
            holder = (ViewHolder) convertView.getTag();
        }
        //设置list的textview显示
        holder.tv.setTextColor(Color.WHITE);
        holder.tv.setText(list.get(position));
        // 根据isSelected来设置checkbox的选中状况
        holder.cb.setId(position);//对checkbox的id进行重新设置为当前的position
        holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                if (isChecked) {//实现checkbox的单选功能,同样适用于radiobutton
                    if (temp != -1) {
                        //找到上次点击的checkbox,并把它设置为false,对重新选择时可以将以前的关掉
                        CheckBox tempCheckBox = (CheckBox) activity.findViewById(temp);
                        if (tempCheckBox != null)
                            tempCheckBox.setChecked(false);
                    }
                    temp = compoundButton.getId();//保存当前选中的checkbox的id值
                }
            }
        });
        if (position == temp)//比对position和当前的temp是否一致
            holder.cb.setChecked(true);
        else
            holder.cb.setChecked(false);
        return convertView;
    }

    public static class ViewHolder {
        TextView tv;
        CheckBox cb;
    }
}

多选:

public class MulActivity extends AppCompatActivity {
    private ListView listView;
    private ArrayList<String> groups;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mul);
        listView = (ListView) this.findViewById(R.id.list);
        groups = new ArrayList<>();
        groups.add("11");
        groups.add("22");
        groups.add("33");
        groups.add("44");
        groups.add("55");
        groups.add("66");
        groups.add("77");
        AdapterView.OnItemClickListener listItemClickListener = new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {
                // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤
                MulAdapter.ViewHolder viewHolder = (MulAdapter.ViewHolder) view.getTag();
                viewHolder.cb.toggle();// 把CheckBox的选中状态改为当前状态的反,gridview确保是单一选中
                MulAdapter.getIsSelected().put(position, viewHolder.cb.isChecked());//将CheckBox的选中状况记录下来
            }
        };
        MulAdapter adapter = new MulAdapter(this, groups);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(listItemClickListener);
    }
}

Adapter:

public class MulAdapter extends BaseAdapter {
    private Context context;//上下文
    private ArrayList<String> list;
    //控制CheckBox选中情况
    private static HashMap<Integer, Boolean> isSelected;
    private LayoutInflater inflater = null;//导入布局

    public MulAdapter(Context context, ArrayList<String> list) {
        this.context = context;
        this.list = list;
        inflater = LayoutInflater.from(context);
        isSelected = new HashMap<Integer, Boolean>();
        initData();
    }

    private void initData() {//初始化isSelected的数据
        for (int i = 0; i < list.size(); i++) {
            getIsSelected().put(i, false);
        }
    }

    @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;
    }

    //listview每显示一行数据,该函数就执行一次
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {//当第一次加载ListView控件时  convertView为空
            convertView = inflater.inflate(R.layout.group_item_view, null);//所以当ListView控件没有滑动时都会执行这条语句
            holder = new ViewHolder();
            holder.tv = (TextView) convertView.findViewById(R.id.item_tv);
            holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);
            convertView.setTag(holder);//为view设置标签
        } else {//取出holder
            holder = (ViewHolder) convertView.getTag();//the Object stored in this view as a tag
        }
        //设置list的textview显示
        holder.tv.setTextColor(Color.WHITE);
        holder.tv.setText(list.get(position));
        // 根据isSelected来设置checkbox的选中状况
        holder.cb.setChecked(getIsSelected().get(position));
        return convertView;
    }

    public static class ViewHolder {
        TextView tv;
        CheckBox cb;
    }

    public static HashMap<Integer, Boolean> getIsSelected() {
        return isSelected;
    }

    public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {
        MulAdapter.isSelected = isSelected;
    }
}

简单吧,哈哈哈。。。

猜你喜欢

转载自blog.csdn.net/darling_R/article/details/54947377