ListView隐藏了一些项目

时间:2013-09-12 18:36:45

标签: android listview adapter

我想根据某些条件隐藏ListView中的一些项目。我找到了2个解决方案,但没有一个有效。我尝试从View方法返回empry getItem(),但仍然可以看到分隔符。因此,如果我隐藏所有项目,例如它会导致大量的分隔线。第二个是在View.GONE方法中设置getItem()。但ListView仍然为不可见的项目保留位置,这导致我的列表中的空视图。有没有人找到这个问题的解决方法?

编辑:我还需要注意,我无法从数据集中删除任何数据。 Adapter / ListView只能隐藏指定的项目。

3 个答案:

答案 0 :(得分:10)

我将通过以下方式实现此目的:

  1. 在适配器内部创建一个列表/数组,它将保存将要隐藏的项目的索引。

    例如:

    List<Integer> hiddenItems;
    
  2. 覆盖适配器getCount()方法以返回数字 列表中的项目减少集合中的项目数 在步骤1中提到。

    例如:

    @Override
    public int getCount() {
        return items.size() - hiddenItems.size();
    }
    
  3. 覆盖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。