listview全选后无法删除不在显示区的item

============问题描述============

本人新手,学习过程中遇到如下问题:

listview中的item数量超出了显示区域,如:一共20个item,显示区能显示10个。当点全选按钮后直接点删除,只能删掉显示区的那10个。当全选按钮点击后,滑动屏幕,这时会发现所有的20个checkbox都勾选了,这时再点删除,则20个全都能够正常删除。

请问高人这个要怎么破?问题出在那?viewholder?现在有点迷糊了。

============解决方案1============

listview加载list1,list1里有18条数据

点全选 - 点删除,代码里做lis1t清空操作

点全选 - 点前10条中的1条 - 点删除,代码里把10条中的那1条item保存下来放到list2中,清空list1,listview加载list2(当然这只是一种解决方法,还有各种其他的方法)

这样行吗

============解决方案2============

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

这里的position只是显示的纪录的索引,所以你下面的deleteMap中没有放入未显示的纪录的索引。

if (holder.checkbox.isChecked() == true) {

deleteMap.put(position, (String)holder.id.getText());

} else {

deleteMap.remove(position);//把之前选中之后又取消的从hashmap中清除

}

============解决方案3============

引用 18 楼 TheUnforgiven 的回复:

Quote: 引用 14 楼 gqjjqg 的回复:

这个思路其实挺简单的,ListView只是负责显示而已,adapter里保存实际的数据

1. 点了全选,把adapter里的数据全标记为选中,刷新ListView让当前显示的View全选中。

2. 滑动或者拖动,对单个点击,就对应的把adapter里的数据标记选中或者非选中,刷新对应的View。

3. 点删除则删除adapter里的数据,并且刷新ListView。

关键就一句话:不要依赖ListView控件的子View 去检查是否有标记。

你的问题关键在于getView时做了不应该做的事情。

getView 推荐只设置显示UI的事情,而不处理数据,否则影响UI显示效率。

//这部分应该在点击删除时处理。

if (holder.checkbox.isChecked() == true) {

deleteMap.put(position, (String)holder.id.getText());

} else {

deleteMap.remove(position);//把之前选中之后又取消的从hashmap中清除

}

您的回答我很收益。如您方便,我再问点吧。

我对MVC有一知半解,您说的大概和它类似吧?通过【应用】→【逻辑】→【显示】实现程序。但是我开始有点混乱了,上面这段 if (holder.checkbox.isChecked())应该算是“逻辑”的部分,但是要怎么把它从“显示”中分离出来呢(我的代码都是从别人的代码那里参考分析来的,所以没有例子我还真不明白呢)?您是否有相关的简单例子能给我看看呢?另外对于下面的代码,应该算是“逻辑”还是“显示”啊?

if(checkVisible)

holder.checkbox.setVisibility(View.VISIBLE);

else

holder.checkbox.setVisibility(View.GONE);

上面这段 if (holder.checkbox.isChecked())应该算是“逻辑”的部分,但是要怎么把它从“显示”中分离出来呢

A: 根本不必要检查checkBox 的状态,checkBox也是个View,只是显示用的,不要去检查它的check状态。check状态建议保存在Adapter内,而不是依赖控件是否checked。

您是否有相关的简单例子能给我看看呢?

A:androidSDK自带sample有很多例子,如果有一定能力了也可以去读读android的源码。

另外对于下面的代码,应该算是“逻辑”还是“显示”啊?

if(checkVisible)

holder.checkbox.setVisibility(View.VISIBLE);

else

holder.checkbox.setVisibility(View.GONE);

A: 这部分适合在getView处理,只是checkVisible要改成check实际保存状态。

个人建议而已,大家共同学习,共同进步。对于不理解的建议先看看ListView的工作流程。

时间: 2024-10-26 04:08:25

listview全选后无法删除不在显示区的item的相关文章

php--jquery操作全选、批量删除、加减行

html代码 加减行 全选  反选 批量删除

关于jquery全选反选 批量删除的一点心得

废话不多说直接上代码: 下面是jsp页面的html代码: <table id="contentTable" class=""> <thead> <tr> <th><input type="checkbox" id="All" value="全选/全不选" />全选/全不选</th> </tr> </thead>

复选框全选、批量删除

// 脚本全选 1 <head runat="server"> 2 <title></title> 3 <script type="text/javascript"> 4 function selectAll(chk) { 5 var checkboxs = document.getElementsByTagName("input"); 6 for (var i = 0; i < checkb

AJAX实现弹窗显示详情,全选和批量删除

以Nation表为例,将Nation表显示在页面上,每一行数据前面加上复选框,后面加上查看详情,点击以弹窗形式显示每一行的数据,并且在表格最后一行加上全选复选框,点击选中全部数据,后面跟一个批量删除按钮,点击删除选中项,如图: 主页面:需要用到弹窗插件,将js与css文件加载过来 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/

Angular实现全选后的取消其中一个选项则不能实现全选

在前面一章我们实现了全选与反选,那么在这一章我们要实现的是取消个别的则不能实现全选 也应该从状态是否被选中入手 html: <td> <input type="checkbox" [(checked)]="item.status" (click)="checkboxClick($event,i);checkBoxOne()"></td> checkboxClick(e,i){ let checkedOne =

Android ListView条目全选功能,不用checkbox实现!

大家好,翻了翻以前的笔记,发现了一个我特别标记的功能,那就是ListView全选功能,顿时想起了我那个时候苦逼的生涯,由于我大学机械出身,大学毕业了都不知道什么叫代码,在58干了一段销售.实在是干不下去了,不干了就得在网上找工作,就喜欢干电脑相关的工作,有一天,一家培训机构给我打来电话让我去面试,我以为让我去工作那,谁知道是忽悠我去培训,我当然不可能花钱了,就直接回去了,想了几天,除了销售我真不知道干啥,咬咬牙,就花钱培训了.我擦,咋说这到了,不跟你们说了,还是写下面的这个功能吧,虽然很简单,但

全选,删除,添加

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="button" value="删除" onclick="b()" /> //删除按钮 <input type="b

ListView多选删除功能实现。

主体思想,把要删除的位置放入List中进行保存,之后根据list进行删除. 实现了全选,反选删除功能. MainActivity public class MainActivity extends Activity { ListView show; List<String> datas = new ArrayList<String>(); ListAdapter adapter; @Override protected void onCreate(Bundle savedInsta

checkbox复选框全选批量删除

多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="FormName" onsubmit="return checkbox();"> <table > <tr ><td><input type="checkbox" name="checkboxes[]"