我想根据某些条件隐藏ListView中的一些项目。我找到了2个解决方案,但没有一个有效。我尝试从View
方法返回empry getItem()
,但仍然可以看到分隔符。因此,如果我隐藏所有项目,例如它会导致大量的分隔线。第二个是在View.GONE
方法中设置getItem()
。但ListView仍然为不可见的项目保留位置,这导致我的列表中的空视图。有没有人找到这个问题的解决方法?
编辑:我还需要注意,我无法从数据集中删除任何数据。 Adapter / ListView只能隐藏指定的项目。
答案 0 :(得分:10)
我将通过以下方式实现此目的:
在适配器内部创建一个列表/数组,它将保存将要隐藏的项目的索引。
例如:
List<Integer> hiddenItems;
覆盖适配器getCount()
方法以返回数字
列表中的项目减少集合中的项目数
在步骤1中提到。
例如:
@Override
public int getCount() {
return items.size() - hiddenItems.size();
}
覆盖getItem()
以返回索引偏移的项目
包含在步骤1的集合中。
例如:
@Override
public Object getItem(int position)
{
for (Integer hiddenIndex : hiddenItems) {
if(hiddenIndex <= position)
position++;
}
// Now your regular getItem code...
}
答案 1 :(得分:6)
<强>更新强>
是的,即使您已将数据提供给适配器,也可以add/remove
。将数据存储在某些ArrayList<type>
中,并将其传递给自定义适配器类。
ArrayList<String> dataList;
// store data in dataList
list.setAdapter(CustomAdapter(YourClass.this, dataList));
最简单的解决方法是remove
来自ListView适配器的那些项目并调用notifyDataSetChanged()
。这将是列表中这些项目的remove the cells/row
。
adapter.remove(object);
adapter.notifyDataSetChanged(); // this will update your ListView
如果您计划再次在列表中使用这些项目,请将它们存储在单独的位置例如将它们存储在文件或数据库中,这最适合您的需求。
答案 2 :(得分:1)
对我来说,你最好的选择是扩展你正在使用的ListAdapter并添加隐藏某些行的方法并调整getCount()
等。或者你可以编写一个包装器适配器(你可以实现{{ 1}} interface)用于此处以及将来需要隐藏行时的任何ListAdapter。