【问题标题】:Filter ListView based on if "Favorite" option is selected根据是否选择“收藏夹”选项过滤 ListView
【发布时间】:2015-06-28 02:57:47
【问题描述】:

我有一个 ListView,带有一个扩展 BaseAdapter 的自定义适配器。 ListView 的来源是一个带有自定义对象的 ArrayList。这些自定义对象有一个最喜欢的成员变量。我希望用户能够单击操作栏中的图标并切换列表是显示所有对象,还是仅显示“最喜欢”属性设置为 true 的对象。

我的第一种看似 hack-y 的解决方案是创建两个 ArrayList,一个包含所有对象,一个包含所有收藏夹。然后单击操作按钮,在两个列表之间切换适配器源列表,如下所示:

protected void toggleList(){
  CustomAdapter adapter;
  if (favoriteSelected){
    adapter=new CustomAdapter(this,favoriteList);
  }else{
    adapter=new CustomAdapter(this,fullList);
  }
  listView.setAdapter(adapter);
}

这似乎可行,但我很难相信没有某种更清洁的方法来过滤列表视图的结果。我能找到的唯一信息是关于根据用户输入的文本进行过滤。

【问题讨论】:

  • 当然,实现你自己的Filter类,在YourAdapter.getFilter()方法中返回它的实例,(YourAdapter需要实现Filterable接口)

标签: java android listview listadapter


【解决方案1】:

怎么样...

class CustomAdapter{
    List<member> mTempMembers;
    List<member> mMembers;

    ...

    showFavorite(boolean isShowFavoriteOnly){

        if(isShowFavoriteOnly){
            mMembers.removeAllExceptFavorite();
        }else{
            mMembers.removeAll(); 
            mMembers.addAll(mTempMembers);
            //mMembers = mTempMembers;
        }
        this.notifyDataSetChanged();

    }

}

【讨论】:

  • 我喜欢你的想法,但是有一个小问题。当我调用 showFavorite(true) 时,它可以正常工作。当我切换回来时,列表视图会显示正确的“完整”列表,其中包含所有收藏和非收藏的联系人,但是当我单击完整列表中的第二个项目时,它会将我带到第二个项目的详细视图最喜欢的列表。因此,似乎 ListView 正在正确更新,但处理项目单击的适配器却没有。有什么想法吗?
  • 怎么样... "else{ mMembers.removeAll(); mMembers.addAll(mTempMembers); }" 而不是 "else{ mMembers = mTempMembers; }"
  • @Zelleat 好的,这行得通,但你能解释一下为什么我必须手动更改 mMembers 的值,而不是重新分配 mMembers 变量吗?
  • 我的原始代码是错误的,因为 mMembers 不是复制 mTempMembers 值,而是作为 mTempMembers。您可以为每个 showFavorite(false) 创建新的 List 变量,它会起作用。但是这种方式有点脏,对适配器没有更好的。我希望适配器只管理一个变量并更改它,并通知适配器数据已更改。我英文不好,不知道我的意思你听不懂,但我觉得这样好一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2020-10-09
  • 2017-12-26
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多