zoukankan      html  css  js  c++  java
  • 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()。

    [java] view plaincopy
     
    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个参数

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



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

    [java] view plaincopy
     
    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.   
    6.                             if (TextUtils.isEmpty(_searchingWord))  
    7.                                 adapter.notifyDataSetChanged();// 通知修改数据  
    8.                             else  
    9.                                 adapter.getFilter().filter(_searchingWord);  
    10.                         }  
    11.                     }  



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

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

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

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

    最终效果如下:

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



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



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

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



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

  • 相关阅读:
    vmware图形化安装kali iso镜像文件启动后黑屏问题解决方法
    8818驱动蓝屏报错解决方法
    v3ray提示已经在运行的错误
    逆向工程之安卓逆向- --- p命名法中插入一个新寄存器
    硬件黑客之无线电 --- Proxmark3 RDV4 套件
    硬件黑客之无线电 --- Plunder Bug LAN Tap
    硬件黑客之局域网安全 --- 鲨鱼杰克
    硬件黑客之无线电 --- Proxmark3 RDV4 套件
    硬件黑客之无线电 --- NFC Kill
    硬件黑客之无线电 --- 双频 WiFi RTL8812AU
  • 原文地址:https://www.cnblogs.com/penghuster/p/5001230.html
Copyright © 2011-2022 走看看