checkbox的listView实现多选,全选,反选
2015-12-27 18:58
393 查看
简单的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#f00"
android:textSize="25sp"
android:text="共选中:" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/bt_all_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="全选"
/>
<Button
android:id="@+id/bt_invert_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="反选"
/>
<Button
android:id="@+id/bt_cancel_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消选择"
/>
</LinearLayout>
<ListView
android:id="@+id/lv_listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
></ListView>
</LinearLayout>
ListView的适配器:
package com.baidu.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import com.baidu.checkbox_all.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class CheckAdapter extends BaseAdapter{
private Context context;
private ArrayList<String> list;
private static HashMap<Integer, Boolean> isSelected;
@SuppressLint("UseSparseArrays")
public CheckAdapter(Context context, ArrayList<String> list) {
super();
this.context = context;
this.list = list;
isSelected=new HashMap<Integer, Boolean>();
// 初始化数据
initData();
}
private void initData() {
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;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh=null;
if(convertView==null){
vh=new ViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.listview_intro, null);
vh.tv_intro_name=(TextView) convertView.findViewById(R.id.tv_intro_name);
vh.cb_intro_check=(CheckBox) convertView.findViewById(R.id.cb_intro_check);
convertView.setTag(vh);
}else{
vh=(ViewHolder) convertView.getTag();
}
vh.tv_intro_name.setText(list.get(position));
vh.cb_intro_check.setChecked(getIsSelected().get(position));
return convertView;
}
public static HashMap<Integer, Boolean> getIsSelected(){
return isSelected;
}
public static void isSelected(HashMap<Integer, Boolean> isSelected){
CheckAdapter.isSelected=isSelected;
}
public static class ViewHolder{
public TextView tv_intro_name;
public CheckBox cb_intro_check;
}
}
在Activity中的代码:
package com.baidu.checkbox_all;
import java.util.ArrayList;
import com.baidu.adapter.CheckAdapter;
import com.baidu.adapter.CheckAdapter.ViewHolder;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView tv_check;
private Button bt_all_select;
private Button bt_invert_select;
private Button bt_cancel_select;
private ListView lv_listview;
private CheckAdapter adapter;
private int checkNum;
private ArrayList<String> list=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
/*
* 实例控件对象
*/
tv_check=(TextView)findViewById(R.id.tv_check);
bt_all_select=(Button)findViewById(R.id.bt_all_select);
bt_invert_select=(Button)findViewById(R.id.bt_invert_select);
bt_cancel_select=(Button)findViewById(R.id.bt_cancel_select);
lv_listview=(ListView)findViewById(R.id.lv_listview);
// 准备数据
initData();
// 适配器
adapter=new CheckAdapter(this, list);
lv_listview.setAdapter(adapter);
// 按钮的监听
bt_all_select.setOnClickListener(this);
bt_invert_select.setOnClickListener(this);
bt_cancel_select.setOnClickListener(this);
// listview的监听器
lv_listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
// 取得viewholder对象
ViewHolder vh=(ViewHolder) arg1.getTag();
// 改变checkbox的状态
vh.cb_intro_check.toggle();
// 将CheckBox的选中状况记录下来
CheckAdapter.getIsSelected().put(position, vh.cb_intro_check.isChecked());
// 调整选中的项目
if(vh.cb_intro_check.isChecked()==true){
checkNum++;
}else{
checkNum--;
}
// 显示选中的条数
tv_check.setText("已选中"+checkNum+"项!");
}
});
}
private void initData() {
for(int i=0;i<20;i++){
list.add("商品"+""+i);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_all_select:
// 遍历listview的长度,将map中的值设为true
for(int i=0;i<list.size();i++){
CheckAdapter.getIsSelected().put(i, true);
}
// 数量设为list的长度
checkNum=list.size();
// 刷新listview和textview的显示
dataChanged();
break;
case R.id.bt_invert_select:
// 遍历list的长度,将已选的设为未选,未选的设为已选
for(int i=0;i<list.size();i++){
if(CheckAdapter.getIsSelected().get(i)){
CheckAdapter.getIsSelected().put(i, false);
checkNum--;
}else{
CheckAdapter.getIsSelected().put(i, true);
checkNum++;
}
}
// 刷新listview和textview的显示
dataChanged();
break;
case R.id.bt_cancel_select:
// 遍历list的长度,将已选的按钮设为未选
for(int i=0;i<list.size();i++){
if(CheckAdapter.getIsSelected().get(i)){
CheckAdapter.getIsSelected().put(i, false);
checkNum--;
}
}
// 刷新listview和textview的显示
dataChanged();
break;
default:
break;
}
}
// 刷新listview和textview的显示
private void dataChanged(){
// 通知listview刷新
adapter.notifyDataSetChanged();
// textview显示最新的选中项目
tv_check.setText("已选中"+checkNum+"项!");
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#f00"
android:textSize="25sp"
android:text="共选中:" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/bt_all_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="全选"
/>
<Button
android:id="@+id/bt_invert_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="反选"
/>
<Button
android:id="@+id/bt_cancel_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消选择"
/>
</LinearLayout>
<ListView
android:id="@+id/lv_listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
></ListView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/tv_intro_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="aaaa" android:textSize="20sp" android:layout_marginLeft="10dp" /> <CheckBox android:id="@+id/cb_intro_check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:focusable="false" android:focusableInTouchMode="false" android:layout_centerInParent="true" /> </RelativeLayout>
ListView的适配器:
package com.baidu.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import com.baidu.checkbox_all.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class CheckAdapter extends BaseAdapter{
private Context context;
private ArrayList<String> list;
private static HashMap<Integer, Boolean> isSelected;
@SuppressLint("UseSparseArrays")
public CheckAdapter(Context context, ArrayList<String> list) {
super();
this.context = context;
this.list = list;
isSelected=new HashMap<Integer, Boolean>();
// 初始化数据
initData();
}
private void initData() {
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;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh=null;
if(convertView==null){
vh=new ViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.listview_intro, null);
vh.tv_intro_name=(TextView) convertView.findViewById(R.id.tv_intro_name);
vh.cb_intro_check=(CheckBox) convertView.findViewById(R.id.cb_intro_check);
convertView.setTag(vh);
}else{
vh=(ViewHolder) convertView.getTag();
}
vh.tv_intro_name.setText(list.get(position));
vh.cb_intro_check.setChecked(getIsSelected().get(position));
return convertView;
}
public static HashMap<Integer, Boolean> getIsSelected(){
return isSelected;
}
public static void isSelected(HashMap<Integer, Boolean> isSelected){
CheckAdapter.isSelected=isSelected;
}
public static class ViewHolder{
public TextView tv_intro_name;
public CheckBox cb_intro_check;
}
}
在Activity中的代码:
package com.baidu.checkbox_all;
import java.util.ArrayList;
import com.baidu.adapter.CheckAdapter;
import com.baidu.adapter.CheckAdapter.ViewHolder;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView tv_check;
private Button bt_all_select;
private Button bt_invert_select;
private Button bt_cancel_select;
private ListView lv_listview;
private CheckAdapter adapter;
private int checkNum;
private ArrayList<String> list=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
/*
* 实例控件对象
*/
tv_check=(TextView)findViewById(R.id.tv_check);
bt_all_select=(Button)findViewById(R.id.bt_all_select);
bt_invert_select=(Button)findViewById(R.id.bt_invert_select);
bt_cancel_select=(Button)findViewById(R.id.bt_cancel_select);
lv_listview=(ListView)findViewById(R.id.lv_listview);
// 准备数据
initData();
// 适配器
adapter=new CheckAdapter(this, list);
lv_listview.setAdapter(adapter);
// 按钮的监听
bt_all_select.setOnClickListener(this);
bt_invert_select.setOnClickListener(this);
bt_cancel_select.setOnClickListener(this);
// listview的监听器
lv_listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
// 取得viewholder对象
ViewHolder vh=(ViewHolder) arg1.getTag();
// 改变checkbox的状态
vh.cb_intro_check.toggle();
// 将CheckBox的选中状况记录下来
CheckAdapter.getIsSelected().put(position, vh.cb_intro_check.isChecked());
// 调整选中的项目
if(vh.cb_intro_check.isChecked()==true){
checkNum++;
}else{
checkNum--;
}
// 显示选中的条数
tv_check.setText("已选中"+checkNum+"项!");
}
});
}
private void initData() {
for(int i=0;i<20;i++){
list.add("商品"+""+i);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_all_select:
// 遍历listview的长度,将map中的值设为true
for(int i=0;i<list.size();i++){
CheckAdapter.getIsSelected().put(i, true);
}
// 数量设为list的长度
checkNum=list.size();
// 刷新listview和textview的显示
dataChanged();
break;
case R.id.bt_invert_select:
// 遍历list的长度,将已选的设为未选,未选的设为已选
for(int i=0;i<list.size();i++){
if(CheckAdapter.getIsSelected().get(i)){
CheckAdapter.getIsSelected().put(i, false);
checkNum--;
}else{
CheckAdapter.getIsSelected().put(i, true);
checkNum++;
}
}
// 刷新listview和textview的显示
dataChanged();
break;
case R.id.bt_cancel_select:
// 遍历list的长度,将已选的按钮设为未选
for(int i=0;i<list.size();i++){
if(CheckAdapter.getIsSelected().get(i)){
CheckAdapter.getIsSelected().put(i, false);
checkNum--;
}
}
// 刷新listview和textview的显示
dataChanged();
break;
default:
break;
}
}
// 刷新listview和textview的显示
private void dataChanged(){
// 通知listview刷新
adapter.notifyDataSetChanged();
// textview显示最新的选中项目
tv_check.setText("已选中"+checkNum+"项!");
}
}
相关文章推荐
- Android适配器之 ArrayAdapter
- Android异步载入全解析之IntentService
- js抽奖系统
- 处理方法整理(不断更新)
- Toast
- 常见的网络编程面试题
- SSH无密码登录要使用公钥与私钥
- 数值优化(Numerical Optimization)学习系列-序列二次规划和内点法(SQP、Interior-Point)
- HDU 5603 树状数组
- Java8新特性——接口的默认方法和类方法
- 数值优化(Numerical Optimization)学习系列-二次规划(Quadratic Programming)
- 数值优化(Numerical Optimization)学习系列-惩罚和增广拉格朗日方法(Augmented Lagrangian Methods)
- HDU 5600 || HDU 5601 思维
- 解决C2143语法错误: 缺少“;”(在“<end Parse>”的前面)
- 1001. A+B Format (20)
- Android JNI技术, NDK开发
- 数值优化(Numerical Optimization)学习系列-非线性约束最优化(Nonlinear Constrained Optimization)
- MPI和MapReduce
- Redux系列01:从一个简单例子了解action、store、reducer
- java枚举使用