热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Android实现ListView控件的多选和全选功能实例

这篇文章主要介绍了Android实现ListView控件的多选和全选功能,结合实例形式分析了ListView控件多选及全选功能的布局与功能实现技巧,需要的朋友可以参考下

本文实例讲述了Android实现ListView控件的多选和全选功能。分享给大家供大家参考,具体如下:

主程序代码

MainActivity.Java

package yy.test;
import java.util.ArrayList;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
  private ListView listView;
  private MyAdapter adapter;
  private ArrayList items;  //模拟存储信息的集合
  private ArrayList checked; //该集合存储被选中的列表项中的TextView中所显示的字符串
  private boolean isMultiple = false; // 记录是否是多选状态,true为是,false不是
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    listView = (ListView) findViewById(R.id.listview);
    items = new ArrayList();
    items.add("00000");
    items.add("11111");
    items.add("22222");
    items.add("33333");
    items.add("44444");
    items.add("55555");
    items.add("66666");
    items.add("77777");
    items.add("88888");
    items.add("99999");
    items.add("aaaaa");
    items.add("bbbbb");
    items.add("ccccc");
    items.add("ddddd");
    adapter = new MyAdapter(items,this); //new出自定义的MyAdapter对象
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<&#63;> arg0, View view, int position,
          long arg3) {
        if(isMultiple){
          CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
          TextView textView = (TextView) view.findViewById(R.id.text);
          if(checkBox.isChecked()){
            checkBox.setChecked(false);
            adapter.checkedMap.put(position, false);
            textView.setTextColor(Color.WHITE);
            adapter.colorMap.put(position, Color.WHITE);
            int index = checked.indexOf(textView.getText()+"");
            checked.remove(index);
          }else{
            checkBox.setChecked(true);
            adapter.checkedMap.put(position, true);
            textView.setTextColor(Color.RED);
            adapter.colorMap.put(position, Color.RED);
            checked.add(textView.getText()+"");
          }
        }
      }
    });
  }
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    SubMenu subMenu = menu.addSubMenu("操作");
    subMenu.add(0, 1, 0, "多选");
    subMenu.add(0, 2, 0, "删除");
    subMenu.add(0, 3, 0, "全选");
    subMenu.add(0, 4, 0, "取消全选");
    return super.onCreateOptionsMenu(menu);
  }
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()==1){
      isMultiple = true;
      checked = new ArrayList();
      int index = adapter.getCount();
      for(int i=0;i();
      int index = adapter.getCount();
      for(int i=0;i

继承自BaseAdapter的MyAdapter

package yy.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
  private LayoutInflater inflater;
  private ArrayList items;
  private Bitmap icon;
  private Context context;
  public Map checkedMap;  //保存checkbox是否被选中的状态
  public Map colorMap;   //保存textview中文字的状态
  public Map visibleMap;  //保存checkbox是否显示的状态
  public MyAdapter(ArrayList items, Context context) {
    super();
    this.items = items;
    this.cOntext= context;
    inflater = LayoutInflater.from(context);
    icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);
    checkedMap = new HashMap();
    colorMap = new HashMap();
    visibleMap = new HashMap();
    for(int i=0;i

主界面的布局文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  


MyAdapter中所使用的布局文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 
 


下面来分析为什么要用map来保存checkbox以及textview的状态。

这个与ListView的刷新机制有关,当你的listview对象很多的时候,每次你拖动listview上下滚动,listview都会刷新一次。怎么刷新呢?比如一个屏幕它最多只显示七条listview,如果你有十条数据,当你想看第八条时,第一条数据理所当然的要被隐藏掉,而第八条数据会被显示,这时listview就刷新了。如果你不保存你所选的checkbox的状态,这时如果你选的是第一条的checkbox的状态为true,当你把余下的第八、第九、第十条数据显示出来时,第十条的checkbox的状态会显示为true,但是它的状态没有被保存,只是你看到它是被选中了而已,其实你选的还是第一条数据。这个问题很操蛋。还有一个更离奇的状态,你让checkbox的状态为true,数据一定要大于十条,你不停的上下拖动屏幕,你会看见checkbox的显示状态会乱跳,但是你实际上选择的还是第一条数据,只是会让你的用户感觉很不爽罢了。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作json格式数据技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 优化Jenkins首次启动速度
    本文详细描述了在启动Jenkins后遇到的长时间加载问题,并提供了一种通过修改更新中心配置文件来显著提升启动速度的有效解决方案。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 烤鸭|本文_Spring之Bean的生命周期详解
    烤鸭|本文_Spring之Bean的生命周期详解 ... [详细]
author-avatar
Wei-Micro_788
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有