3

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

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

4

3 回答 3

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...
    }
    
于 2013-09-12T18:42:56.993 回答
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

如果您计划将来再次在列表中使用这些项目,请将它们存储在单独的位置,例如将它们存储在最适合您需求的文件或数据库中。

于 2013-09-12T18:43:38.817 回答
1

在我看来,您最好的选择是扩展您正在使用的 ListAdapter 并添加用于隐藏某些行和调整getCount()等的方法。或者您可以编写一个包装适配器(您可以实现该WrapperListAdapter接口),以便在此处和此处与任何 ListAdapters 一起使用无论何时需要隐藏行的未来。

于 2013-09-12T18:43:28.957 回答