baseadapter.getItemId的使用方法:实现listview筛选、动态删除
转载:http://www.lai18.com/content/1631131.html
这里的listview筛选是指listview的adapter实现filter来过滤数据。
“动态删除"是指,使用filter筛选数据后,对筛选后的数据的删除操作,实际上是对筛选前的数据产生影响。
实现目标:举例来说:
Listview原来显示:1,2,3,4,5,6,11,12,13,14
使用filter筛选“1”后显示:1,11,12,13,14
此时我选中11(第二项),删除之。当前应该还显示1,12,13,14;而关闭筛选后,数据应该显示:1,2,3,4,5,6,12,13,14
listview+adapter的使用方法见:
继承BaseAdapter实现Filterable的adapter类完整示例
其中继承BaseAdapter中getItemId(int position)方法介绍见:
Baseadapter的 getItem 和 getItemId 的作用和重写
该方法通常是直接返回 position。但这在列表会变化时,如上述的筛选,是不正确的。
如果适配器中的数据有可以唯一标识数据的整型字段,可以将其返回,这在特定的几个情况会用到。
如下:我在该函数返回了数据集_data中数据的getID()。
- @Override
- public long getItemId(int position) {
- // 自定义ID
- // 在此最好返回数据的唯一标识,在一些特定情况下使用到
- // 如果没有,此处一般返回position
- return _data.get(position).getID();
- }
那么,会在什么时候用到适配器的getItemId方法呢?
上面的文章no.2说了,这个方法并不是给适配器使用的方法,实际上是用来在我们设置
setOnItemClickListener、setOnItemLongClickListener、setOnItemSelectedListener的点击选择处理事件中方便地调用来获取当前行数据的。
来看下面的例子:长按listview事件,注意onItemClick的4个参数
- lvContent.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- String s = String.format(
- "position+1:%s\nid:%s\ngetItemIdAtPosition:%s\n",
- position + 1, id,
- parent.getItemIdAtPosition(position));
- String s1 = "ViewTagVo:"
- + ((VoStation) view.getTag(R.id.tagVO)).getName();
- String s2 = "ParentItemVo:"
- + ((VoStation) parent.getItemAtPosition(position))
- .getName();
- Toast.makeText(getActivity(),
- s + "\n" + s1 + "\n" + s2 + "\n", Toast.LENGTH_LONG)
- .show();
- }
- });
上述代码输出的点击列表中一项item时,该item的以下属性:
position+1:来自参数,+1是为了方便比较
id:来自参数(我按顺序给我的数据从1001开始赋值ID:1001,1002...)
getItemIdAtPosition:使用parent.getItemIdAtPosition(position)获得的值。
我还比较了parent.getItemAtPosition(position) 和view.getTag获得数据的一致性。
通常情况下,我们使用position来桉顺序访问列表,以及数据集,如_data.get(position),甚至使用position来删除对应的项,这在列表固定时是可以正常使用的,如下:
(点击 基站5)
但是。listview配合adpater实现filter接口,达到数据筛选的目的时,当前列表是会动态变化的,这时再点击 基站5,如下:
可以看到,position属性是指示item在当前适配器(包括filter后)的位置,这也是其本意。如果此时使用position属性来删除数据,删除的实际上是position=0的“基站1”,而不是点击的基站5.
所以,当需要对列表中项目进行操作时,最好给他配上唯一的ID,这个ID可以是临时配给数据的,只要在当前adapter中可以唯一指定一个数据就行。
正确的删除操作:(其中itemId是获得到的id参数)
- for (int i = 0; i < datas.size(); i++) {
- if (datas.get(i).getID() == itemId) {
- datas.remove(i);
- adapter.resetData(datas);// 重设适配器的数据集
- if (TextUtils.isEmpty(_searchingWord))
- adapter.notifyDataSetChanged();// 通知修改数据
- else
- adapter.getFilter().filter(_searchingWord);
- }
- }
resetData() getFilter()方法,见开头第一篇文章中的类定义。这里说一下思路:
1、遍历数据集找到指定的ID (不使用position)
2、从数据集中移除该项,然后重置适配器的数据
3、通知数据变化(此处我用了一个判断,_searchingWord是用户当前正在搜索的关键字,如果为空,说明用户在没有筛选数据时删除一项,可以直接通知数据变化来刷新listview。如果搜索关键字不为空,说明用户是在搜索出某些项目时对其中的一项进行删除。所以,删除数据后我们再次对新的数据进行相同的过滤。否则直接显示除了删除项的其他数据,影响用户体验)。
最终效果如下:
(筛选出标题含5的基站:)
对基站5 进行删除操作(我使用的长按弹出删除菜单后删除)
此时可以看到,基站5被删除了,但是界面仍然显示出了被筛选出的剩余的基站15。
此时关闭搜索框,如下:(基站5的确是被删除了。)
刚开始学安卓,也不知道我实现这效果的方式对不对。欢迎指正。
baseadapter.getItemId的使用方法:实现listview筛选、动态删除的更多相关文章
- ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序
FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true protecte ...
- Android ListView左滑删除、左滑自定义功能
最近项目需要ListView左滑删除功能,搜集了很多资料发现了一个某一前辈写的库能很简单的实现这个功能,而且有源码,直接拿来使用了. 库名字叫做SwipeMenuListView,下面给大家演示一下使 ...
- Android零基础入门第44节:ListView数据动态更新
原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...
- 【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...
- [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...
- 兰亭集势笔试题:用最优方法从LinkedList列表中删除重复元素
用运行速度最优的方法从LinkedList列表里删除重复的元素,例如A->B->BB->B->C,返回A->B->BB->C. 考试的时候没完全想明白,考完又 ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
随机推荐
- 函数flst_remove
移除 node, node->prev直接指向node->next /*********************************************************** ...
- LA 3266 (贪心) Tian Ji -- The Horse Racing
题意: 田忌和齐王各有n匹马,如果马的速度比齐王的快就赢200,慢则输200,相等不赔不赚. 已知两人每匹马的速度(为整数)和齐王所排出的马的顺序,问田忌该如何应对才能使收益最大. 分析: 本以为是一 ...
- 待实践三:MVC3下 路由的测试 使用 RouteDebug.dll 来测试判断路由是否符合
在需要进行测试路由是否匹配的项目中引用 RouteDebug.dll 并且在MVC的Global.asax里面加入一段代码 //下面这行代码一定是在 RegisterRoutes(Rou ...
- [转]使用微软的官方类库CHSPinYinConv获得汉字拼音
原文链接:http://outofmemory.cn/code-snippet/4392/ms-CHSPinYinConv-convert-hanzi-to-pinyin 微软为中文,日文以及韩文提供 ...
- uvalive 3523 Knights of the Round Table 圆桌骑士(强连通+二分图)
题目真心分析不出来.看了白书才明白,不过有点绕脑. 容易想到,把题目给的不相邻的关系,利用矩阵,反过来建图.既然是全部可行的关系,那么就应该能画出含奇数个点的环.求环即是求双连通分量:找出所有的双连通 ...
- codevs 1218 疫情控制
啊好烦这道题.... 基本思路网上都有. 注意的一点是在匹配的时候,如果有军队的来源没有被匹配到,那么就先匹配这个来源.(因为不花钱). 不过数据好水.... #include<iostream ...
- POJ 3259 Wormholes 虫洞(负权最短路,负环)
题意: 给一个混合图,求判断是否有负环的存在,若有,输出YES,否则NO.有重边. 思路: 这是spfa的功能范围.一个点入队列超过n次就是有负环了.因为是混合图,所以当你跑一次spfa时发现没有负环 ...
- Java泛型的好处
java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. ...
- Jedis的JedisSentinelPool源代码分析
概述 Jedis是Redis官方推荐的Java客户端,更多Redis的客户端可以参考Redis官网客户端列表.Redis-Sentinel作为官方推荐的HA解决方案,Jedis也在客户端角度实现了对S ...
- golang语言部分保留字的举例
golang和c的代码有很大不同的,一不小心就会误用. 1 /* go保留字: */ /* break default func interface select case defer go map ...