2015-04-21 62 views
0

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

我的第一种类似hack-y的解决方案是创建两个ArrayLists,其中一个包含所有对象,其中一个包含所有的收藏夹。然后在动作按钮点击,转换适配器源列表两个列表之间是这样的:

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

这似乎是它的工作,但我有一个很难相信,没有某种形式的清洁方法过滤列表视图的结果。我所能找到的唯一信息是基于用户输入的文本进行过滤。

+0

肯定,实现自己的Filter类,在YourAdapter.getFilter返回它的实例()方法,(YourAdapter需要实现的可筛选接口) – pskink

回答

0

......怎么

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(); 

    } 

} 
+1

我很喜欢你的想法,但是,有一个小问题。当我打电话给showFavorite(true)时,它正常工作。当我切换回来时,listview会显示所有最喜欢和不喜欢的联系人的正确“完整”列表,但是当我点击完整列表中的第二个项目时,它会将我带到第二个项目的详细视图最爱列表。所以看起来好像ListView正在更新,但处理项目点击的适配器不是。有任何想法吗? – user50210

+0

......怎么 “否则{ mMembers.removeAll(); mMembers.addAll(mTempMembers);} ” 而不是 “其他{ mMembers = mTempMembers; }” – HoJunLee

+0

@Zelleat确定这工作,但你能解释为什么我必须手动改变mMembers的值,而只是重新指定mMembers变量吗? – user50210