android+listview多选删除,Android ListView的批量处理(多选/反选/删除)_weixin_39633171的博客-程序员秘密

技术标签: android+listview多选删除  

在Android开发中经常遇到使用ListView的情况,有时候需要的不仅仅是列表显示,还有长按列表进行多选,并且批量删除的情况,在这里记录一下自己的所学。

先上效果图:

22c5bfa3badaff75ce4893826656f48e.gif

几个需要用到的核心方法:

//设置多选模式,下面的方法基于设置多选模式

list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

//获取Item选择状态:

list.isItemChecked(i);

//设置Item选择状态

list.setItemChecked(i, true);

//清除全部选中状态

list.clearChoices();

简述原理

多选模式下,ListView在触发OnItemClick时会设置Item为true,再点一次为false,

我们只需创建一个isMultiplSelectionMode来传递判断当前为多选模式,

在全选时遍历list.setItemChecked()为true;

反选时遍历list.isItemChecked(i)为true的set为false,false则为true,

删除时直接遍历list.isItemChecked(i)为true的在适配器上直接remove删除即可

假装深入源码

我们知道ListView继承AbsListView,

通过查看他的源码的isItemChecked方法,可以看到

...

public boolean isItemChecked(int position) {

if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {

return mCheckStates.get(position);

}

return false;

}

...

首先判断了当前选择模式不等于默认的单选模式 && mCheckStates 不为空的时候从这个mCheckStates去获取当前的item的选择状态,那我们再来看看这个mCheckStates到底是什么?

/**

* Running state of which positions are currently checked

*/

SparseBooleanArray mCheckStates;

mCheckStates是SparseBooleanArray的实例,SparseBooleanArray实现了Cloneable接口,再往下就离题了,现在知道了mCheckStates本质是一个保存着Boolean的Array,并且这个Array与Items有关系,setItemChecked/isItemChecked都使用了mCheckStates,获取的就是Item的状态,逻辑他已经帮我们写好,我们只用用好isItemChecked即可。

(好像说了和没说一样,尴尬了|;)

直接上源码把

activity_main.xml

先界面:1个显示选择个数的TextView,3个Button,1个ListView

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

android:visibility="gone"

android:id="@+id/ItemToolBar"

android:orientation="horizontal"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="选择了0项"

android:id="@+id/counttext"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="全选"

android:id="@+id/all"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="反选"

android:id="@+id/unall"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="删除"

android:id="@+id/del"/>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/mylistview"/>

listview_item.xml

当然还有Item项的界面,简单点,两个TextView,一个标题,一个内容

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Large Text"

android:textAppearance="?android:attr/textAppearanceLarge"

android:id="@+id/lv_text1"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Small Text"

android:textAppearance="?android:attr/textAppearanceSmall"

android:id="@+id/lv_text2"/>

MyAdapter.java

ListView的适配器,重写了getView方法,让当前可视部分的项目状态为选中时改变背景颜色,关于geiView的ViewHolder部分可以看这的文章【Android开发中常用的ListView列表的优化方式ViewHolder】,简而言之就是一种列表优化方式。

public class MyAdapter extends BaseAdapter {

public ArrayList> balistItem = new ArrayList>();

@Override

public int getCount() {

return balistItem.size();

}

@Override

public long getItemId(int p1) {

return p1);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder;

if (convertView == null) {

viewHolder = new ViewHolder();

convertView = View.inflate(MainActivity.CONTEXT, R.layout.listview_item, null);

viewHolder.title = convertView.findViewById(R.id.lv_text1);

viewHolder.text = convertView.findViewById(R.id.lv_text2);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder)convertView.getTag();

}

viewHolder.title.setText(balistItem.get(position).get("标题").toString());

viewHolder.text.setText(balistItem.get(position).get("内容").toString());

//判断position位置是否被选中,改变颜色

if (MainActivity.list.isItemChecked(position) && MainActivity.isMultipleSelectionMode) {

convertView.setBackgroundColor(0xffff521d);

} else {

convertView.setBackgroundColor(0xff1E90FF);

}

return convertView;

}

public MyAdapter(List extends Map> data) {

this.balistItem = (ArrayList>) data;

}

private static class ViewHolder {

TextView title;

TextView text;

public static ViewHolder newsInstance(View convertView) {

ViewHolder holder = (ViewHolder) convertView.getTag();

if (holder == null) {

holder = new ViewHolder();

holder.title = convertView.findViewById(R.id.lv_text1);

holder.text = convertView.findViewById(R.id.lv_text2);

convertView.setTag(holder);

}

return holder;

}

}

}

MainActivity.java

创建数据,并添加至适配器,设置长按进入多选模式,

public class MainActivity extends AppCompatActivity {

static ListView list;

static MyAdapter listItemAdapter;//适配器

static boolean isMultipleSelectionMode;//判断进入多选模式

public static ArrayList> AdapterList = new ArrayList<>(); //数据

public static Context CONTEXT;

TextView counttext;

LinearLayout ItemToolBar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

CONTEXT = this.getApplicationContext();

//初始化数据

initData();

counttext = this.findViewById(R.id.counttext);//选中时更改的textview

ItemToolBar = this.findViewById(R.id.ItemToolBar);//多选模式的工具栏

list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

listItemAdapter = new MyAdapter(AdapterList); //新建并配置ArrayAapeter

list.setAdapter(listItemAdapter);

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> p, View v, int index,

long arg3) {

if (isMultipleSelectionMode) {

setCountChange();

}

listItemAdapter.notifyDataSetChanged();

}

});

list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

@Override

public boolean onItemLongClick(AdapterView> parent, View view, int position, long itemId) {

if (isMultipleSelectionMode) {

ItemToolBar.setVisibility(View.GONE);

isMultipleSelectionMode = false;

list.clearChoices();//取消选中状态

Toast.makeText(CONTEXT, "退出多选模式", Toast.LENGTH_LONG).show();

} else {

ItemToolBar.setVisibility(View.VISABLE); isMultipleSelectionMode =true;

listItemAdapter.notifyDataSetChanged();

//多选模式

Toast.makeText(CONTEXT, "进入多选模式", Toast.LENGTH_LONG).show();

for(int i = 0;i < listItemAdapter.balistItem.size();i++){

Log.d("del","Item" + i + "的状态:" + list.isItemChecked(i));

}

return true;

}

listItemAdapter.notifyDataSetChanged();

setCountChange();

return false;

}

});

//设置按钮单机事件绑定

setButtonClick();

}

public void setCountChange(){

counttext.setText("选中了" + list.getCheckedItemCount() +"项");

}

public void initData(){

list = this.findViewById(R.id.mylistview);

for(int i = 0;i< 5;i++){

HashMap map = new HashMap<>();

map.put("标题","这是标题" + i);

map.put("内容","这是内容" + i);

AdapterList.add(map);

}

}

public void setButtonClick(){

Button all = this.findViewById(R.id.all);

Button unall = this.findViewById(R.id.unall);

Button del = this.findViewById(R.id.del);

all.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

for(int i = 0;i < listItemAdapter.balistItem.size();i++){

list.setItemChecked(i,true);

}

setCountChange();

}

});

unall.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

for(int i = 0;i < listItemAdapter.balistItem.size();i++){

if(list.isItemChecked(i)){

list.setItemChecked(i,false);

list.setItemChecked(i,false);

}else {

list.setItemChecked(i,true);

}

}

setCountChange();

}

});

del.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

for(int i = 0;i < listItemAdapter.balistItem.size();i++){

if(list.isItemChecked(i)){

listItemAdapter.balistItem.remove(i);

listItemAdapter.notifyDataSetChanged();

}

}

list.clearChoices();

setCountChange();

}

});

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39633171/article/details/117565682

智能推荐

DATEPART() 函数_datepart函数_月亮哥的博客-程序员秘密

SQL Server DATEPART() 函数 定义和用法DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。语法DATEPART(datepart,date)date 参数是合法的日期表达式。datepart 参数可以是下列的值: datepart缩写年yy, yyyy季度qq,

Spring Boot 之FilterRegistrationBean --支持web Filter 排序的使用_你走开``的博客-程序员秘密

Spring Boot 之FilterRegistrationBean  –支持web Filter 排序的使用Spring 提供了FilterRegistrationBean类,此类提供setOrder方法,可以为filter设置排序值,让spring在注册web filter之前排序后再依次注册。  写一个普通的filter:[java] view plain copy print?pac

Linux服务器集群系统(三)_linux服务器集群分类_p312011150的博客-程序员秘密

LVS集群中的IP负载均衡技术章文嵩 ([email protected]) 2002 年 4 月本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)的工作原理,以及它们的优缺点。1.前言在 前面文章中,讲述了可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)...

VGG网络:网络改造的首选基础网络_vgg改进_essenge的博客-程序员秘密

import torch.nn as nnimport torchclass VGG(nn.Module): def __init__(self, features, num_classes=1000, init_weights=False): super(VGG, self).__init__() self.features = features self.classifier = nn.Sequential( nn.D

Linux【实操篇】—— Shell函数、Shell编程综合案例(定时备份数据库)_shell编程综合设计_敬 之的博客-程序员秘密

Linux 操作系统Shell编程快速入门、shell函数,Shell编程综合案例(定时备份数据库)。

【Vue组件自定义事件详解】_小田『开心馆』的博客-程序员秘密

本篇文章介绍了组件自定义事件的原理以及使用的方法,在实际开发中,组件的自定义事件也是一个小技巧,能有效提高开发的效率

随便推点

多智能体中的图论——图论中的定义(一)_多智能体图论_autotian的博客-程序员秘密

目前人工智能分为:大数据智能,跨媒体智能,群体智能,混合增强智能,自主无人系统五类,若想要深入群体智能则图论的基础是非常必要的!一、引言1.1、专业词汇:distributed network:分布式网络 distributed multiagent network:分布式多智能体网络boids model:柏兹模型(类鸟型) topology:拓扑结构directed ...

盘点项目管理工具DHTMLX Gantt 的常见问题_dhtmlxgantt_爱分享的小妮子的博客-程序员秘密

可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术(PHP,ASP.NET,Java等)简单集成,满足多种定制开发需求。默认情况下,任务的最后一天不包括在任务的持续时间中,但可以更改默认行为并将最后一天包括在持续时间中。如果您已经安装了许可的专业版甘特图,但仍然看到评估期已过期的消息,这意味着您的应用程序中某处有试用版。为了确保所描述的行为对您的情况是真实的,您可以在浏览器的导航面板中检查 URL。

ABAP (转)BDC常见问题_abap bdc_yiyuzz的博客-程序员秘密

BDC在FICO模块是经常用到的,用于批量过账程序时使用的,但是稳定性不如使用BAPI的好,但是BDC可以有多种T-CODE进行过账,也有不同的模式,功能也不错,但是在写程序或者是出现问题的时候需要考虑下面几个问题:1、可以在程序加入BDC的模式选择,默认为N模式,但是可以选择A模式,方便调试。当然这个也可以debug进去之后进行改值。2、LOOP里面有call BDC的情况,在每一次ca...

iw 命令_斷點1的博客-程序员秘密

关于 iwiw 是一种新的基于 nl80211 的用于无线设备的CLI配置实用程序。它支持最近已添加到内核所有新的驱动程序。采用无线扩展接口的旧工具iwconfig已被废弃,强烈建议切换到 iw 和 nl80211。像Linux内核的其余部分,iw 仍处于开发阶段。功能被随时添加。 iw 的唯一文档就是此页和“iw help”的输出。 请帮助扩大这个

提高级:初等数论 威尔逊定理_威尔逊定理扩展形式_dllglvzhenfeng的博客-程序员秘密

数论四大定理之威尔逊定理数论四大定理之威尔逊定理 - 简书威尔逊定理及其证明 - clockwhite - 博客园数论四大定理之威尔逊定理_L__ear的博客-程序员秘密_威尔逊定理威尔逊定理威尔逊定理_Michael_Li的博客-程序员秘密_威尔逊定理威尔逊定理_jkchen's Haven-程序员秘密威尔逊定理 数论威尔逊定理 数论_初学者-程序员秘密_威尔逊定理如何用最简单明了的话语解释威尔逊定理吗?哪种证明威尔逊定理的方法最简单?如何用最简