博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ListView CheckBox的实现
阅读量:6120 次
发布时间:2019-06-21

本文共 5369 字,大约阅读时间需要 17 分钟。

hot3.png

实现类似下图功能:

18100040_PsuJ.gif

代码如下:

activity_main.xml:

    
    
        
        
        
        

listviewitem.xml:

    
    

MainActivity.java:

public class MainActivity extends Activity { private ListView lv; private MyAdapter mAdapter; private ArrayList
 list; private Button bt_selectall; private Button bt_cancel; private Button bt_deselectall; private int checkNum; // 记录选中的条目数量 private TextView tv_show;// 用于显示选中的条目数量 @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  /* 实例化各个控件 */  lv = (ListView) findViewById(R.id.lv);  bt_selectall = (Button) findViewById(R.id.bt_selectall);  bt_cancel = (Button) findViewById(R.id.bt_cancleselectall);  bt_deselectall = (Button) findViewById(R.id.bt_deselectall);  tv_show = (TextView) findViewById(R.id.tv);  list = new ArrayList
();  // 为Adapter准备数据  initDate();  // 实例化自定义的MyAdapter  mAdapter = new MyAdapter(list, this);  // 绑定Adapter  lv.setAdapter(mAdapter);  // 全选按钮的回调接口  bt_selectall.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    // 遍历list的长度,将MyAdapter中的map值全部设为true    for (int i = 0; i < list.size(); i++) {     MyAdapter.getIsSelected().put(i, true);    }    // 数量设为list的长度    checkNum = list.size();    // 刷新listview和TextView的显示    dataChanged();   }  });  // 反选按钮的回调接口  bt_cancel.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    // 遍历list的长度,将已选的设为未选,未选的设为已选    for (int i = 0; i < list.size(); i++) {     if (MyAdapter.getIsSelected().get(i)) {      MyAdapter.getIsSelected().put(i, false);      checkNum--;     } else {      MyAdapter.getIsSelected().put(i, true);      checkNum++;     }    }    // 刷新listview和TextView的显示    dataChanged();   }  });  // 取消按钮的回调接口  bt_deselectall.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    // 遍历list的长度,将已选的按钮设为未选    for (int i = 0; i < list.size(); i++) {     if (MyAdapter.getIsSelected().get(i)) {      MyAdapter.getIsSelected().put(i, false);      checkNum--;// 数量减1     }    }    // 刷新listview和TextView的显示    dataChanged();   }  });  // 绑定listView的监听器  lv.setOnItemClickListener(new OnItemClickListener() {   @Override   public void onItemClick(AdapterView
 arg0, View arg1, int arg2,     long arg3) {    // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤    ViewHolder holder = (ViewHolder) arg1.getTag();    // 改变CheckBox的状态    holder.cb.toggle();    // 将CheckBox的选中状况记录下来    MyAdapter.getIsSelected().put(arg2, holder.cb.isChecked());    // 调整选定条目    if (holder.cb.isChecked() == true) {     checkNum++;    } else {     checkNum--;    }    // 用TextView显示    tv_show.setText("已选中" + checkNum + "项");   }  }); } // 初始化数据 private void initDate() {  for (int i = 0; i < 15; i++) {   list.add("data" + " " + i);  }  ; } // 刷新listview和TextView的显示 private void dataChanged() {  // 通知listView刷新  mAdapter.notifyDataSetChanged();  // TextView显示最新的选中数目  tv_show.setText("已选中" + checkNum + "项"); };}

MyAdapter.java:

public class MyAdapter extends BaseAdapter { // 填充数据的list private ArrayList
 list; // 用来控制CheckBox的选中状况 private static HashMap
 isSelected; // 上下文 private Context context; // 用来导入布局 private LayoutInflater inflater = null; // 构造器 public MyAdapter(ArrayList
 list, Context context) {  this.context = context;  this.list = list;  inflater = LayoutInflater.from(context);  isSelected = new HashMap
();  // 初始化数据  initDate(); } // 初始化isSelected的数据 private void initDate() {  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 holder = null;  if (convertView == null) {   // 获得ViewHolder对象   holder = new ViewHolder();   // 导入布局并赋值给convertview   convertView = inflater.inflate(R.layout.listviewitem, null);   holder.tv = (TextView) convertView.findViewById(R.id.item_tv);   holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);   // 为view设置标签   convertView.setTag(holder);  } else {   // 取出holder   holder = (ViewHolder) convertView.getTag();  }  // 设置list中TextView的显示  holder.tv.setText(list.get(position));  // 根据isSelected来设置checkbox的选中状况  holder.cb.setChecked(getIsSelected().get(position));  return convertView; } public static HashMap
 getIsSelected() {  return isSelected; } public static void setIsSelected(HashMap
 isSelected) {  MyAdapter.isSelected = isSelected; } public static class ViewHolder {  TextView tv;  CheckBox cb; }}

ok!

扩展:以上复选框状态的变化是通过,private void dataChanged() {

 // 通知listView刷新  mAdapter.notifyDataSetChanged();  // TextView显示最新的选中数目  tv_show.setText("已选中" + checkNum + "项"); };

实现的。也可以这样实现,不通过mAdapter.notifyDataSetChanged();

ListViewServerListAdapter.ListItemView lv = (ListViewServerListAdapter.ListItemView) view.getTag();    lv.cb.toggle();    ListViewServerListAdapter.isSelected.put(position, lv.cb.isChecked());

转载于:https://my.oschina.net/u/660536/blog/368989

你可能感兴趣的文章
app内部H5测试点总结
查看>>
Docker - 创建支持SSH服务的容器镜像
查看>>
[TC13761]Mutalisk
查看>>
三级菜单
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
查看>>
while()
查看>>
常用限制input的方法
查看>>
Ext Js简单事件处理和对象作用域
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
12.通过微信小程序端访问企查查(采集工商信息)
查看>>
WinXp 开机登录密码
查看>>
POJ 1001 Exponentiation
查看>>
HDU 4377 Sub Sequence[串构造]
查看>>
云时代架构阅读笔记之四
查看>>
WEB请求处理一:浏览器请求发起处理
查看>>
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>
LeetCode 404 Sum of Left Leaves
查看>>
醋泡大蒜有什么功效
查看>>