转载: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()。

  1. @Override
  2. public long getItemId(int position) {
  3. // 自定义ID
  4. // 在此最好返回数据的唯一标识,在一些特定情况下使用到
  5. // 如果没有,此处一般返回position
  6. return _data.get(position).getID();
  7. }

那么,会在什么时候用到适配器的getItemId方法呢?

上面的文章no.2说了,这个方法并不是给适配器使用的方法,实际上是用来在我们设置

setOnItemClickListener、setOnItemLongClickListener、setOnItemSelectedListener的点击选择处理事件中方便地调用来获取当前行数据的。

来看下面的例子:长按listview事件,注意onItemClick的4个参数

  1. lvContent.setOnItemClickListener(new OnItemClickListener() {
  2. @Override
  3. public void onItemClick(AdapterView<?> parent, View view,
  4. int position, long id) {
  5. String s = String.format(
  6. "position+1:%s\nid:%s\ngetItemIdAtPosition:%s\n",
  7. position + 1, id,
  8. parent.getItemIdAtPosition(position));
  9. String s1 = "ViewTagVo:"
  10. + ((VoStation) view.getTag(R.id.tagVO)).getName();
  11. String s2 = "ParentItemVo:"
  12. + ((VoStation) parent.getItemAtPosition(position))
  13. .getName();
  14. Toast.makeText(getActivity(),
  15. s + "\n" + s1 + "\n" + s2 + "\n", Toast.LENGTH_LONG)
  16. .show();
  17. }
  18. });

上述代码输出的点击列表中一项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参数)

  1. for (int i = 0; i < datas.size(); i++) {
  2. if (datas.get(i).getID() == itemId) {
  3. datas.remove(i);
  4. adapter.resetData(datas);// 重设适配器的数据集
  5. if (TextUtils.isEmpty(_searchingWord))
  6. adapter.notifyDataSetChanged();// 通知修改数据
  7. else
  8. adapter.getFilter().filter(_searchingWord);
  9. }
  10. }

resetData() getFilter()方法,见开头第一篇文章中的类定义。这里说一下思路:

1、遍历数据集找到指定的ID (不使用position)

2、从数据集中移除该项,然后重置适配器的数据

3、通知数据变化(此处我用了一个判断,_searchingWord是用户当前正在搜索的关键字,如果为空,说明用户在没有筛选数据时删除一项,可以直接通知数据变化来刷新listview。如果搜索关键字不为空,说明用户是在搜索出某些项目时对其中的一项进行删除。所以,删除数据后我们再次对新的数据进行相同的过滤。否则直接显示除了删除项的其他数据,影响用户体验)。

最终效果如下:

(筛选出标题含5的基站:)

对基站5 进行删除操作(我使用的长按弹出删除菜单后删除)

此时可以看到,基站5被删除了,但是界面仍然显示出了被筛选出的剩余的基站15。

此时关闭搜索框,如下:(基站5的确是被删除了。)

刚开始学安卓,也不知道我实现这效果的方式对不对。欢迎指正。

baseadapter.getItemId的使用方法:实现listview筛选、动态删除的更多相关文章

  1. ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序

    FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true protecte ...

  2. Android ListView左滑删除、左滑自定义功能

    最近项目需要ListView左滑删除功能,搜集了很多资料发现了一个某一前辈写的库能很简单的实现这个功能,而且有源码,直接拿来使用了. 库名字叫做SwipeMenuListView,下面给大家演示一下使 ...

  3. Android零基础入门第44节:ListView数据动态更新

    原文:Android零基础入门第44节:ListView数据动态更新 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据都是 ...

  4. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  5. 【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...

  6. [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

  7. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

  8. 兰亭集势笔试题:用最优方法从LinkedList列表中删除重复元素

    用运行速度最优的方法从LinkedList列表里删除重复的元素,例如A->B->BB->B->C,返回A->B->BB->C. 考试的时候没完全想明白,考完又 ...

  9. C++调用DLL有两种方法——静态调用和动态调用

    C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报  分类: cpp(30)  [ ...

随机推荐

  1. overload和override

    Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Ove ...

  2. bzoj2466: [中山市选2009]树

    同上一题.(应该可以树形dp,然而我不会... #include<cstdio> #include<cstring> #include<iostream> #inc ...

  3. ASP.NET MVC Html.ActionLink使用说明

    本文整理了该方法的几种重载形式: 1.Html.ActionLink("linkText","actionName")该重载的第一个参数是该链接要显示的文字,第 ...

  4. [反汇编练习] 160个CrackMe之016

    [反汇编练习] 160个CrackMe之016. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. 省常中模拟 Test4

    prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...

  6. DirectX截图黑屏的解决办法

    好久没有更新博客了,今天开始继续耕耘. 生活要继续 工作要继续 梦想也一定要继续! 之前写过一篇关于DirectX截屏的文章,其中有网友留言提到了截图黑屏的问题,于是这些日子研究了一下,与大家一同分享 ...

  7. TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)

    在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...

  8. 程序破解之 API HOOK技术 z

    API HOOK,就是截获API调用的技术,在程序对一个API调用之前先执行你的函数,然后根据你的需要可以执行缺省的API调用或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socke ...

  9. VS2010生成Qt程序图标修改方法

    转自:http://blog.csdn.net/simeone18/article/details/7344547 1.准备ico文件,nuistcard.ico 2.在nuistcard工程目录,建 ...

  10. 你今天Python了吗?(上)

    你今天Python了吗?为了提高你的生产效率,赶快去关注一下小蟒蛇的成长吧!别再把Python当作你的业余爱好了,她能为你做手头上几乎所有的工作,而且能做得更好,也让你把写代码看成是一种真正的乐趣.为 ...