【问题标题】:ListView hide some itemsListView 隐藏一些项目
【发布时间】:2013-09-13 14:30:18
【问题描述】:

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

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

【问题讨论】:

    标签: android listview adapter


    【解决方案1】:

    我将通过以下方式实现:

    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...
      }
      

    【讨论】:

    • 但是如果最后一项被隐藏了怎么办?在您的情况下,它会将位置 b 提高一个,但没有剩余元素
    • 如果 hiddenItems 未排序,不要忘记对它们进行排序。我花了好几个小时来修复这个错误。同样正如@MarianKlühsies 所注意到的,我添加了一些代码: return position
    【解决方案2】:

    更新:

    是的,即使您已经向适配器提供了数据,您也可以add/remove。将数据存储在一些ArrayList&lt;type&gt; 中并将其传递给自定义适配器类。

    ArrayList<String> dataList;
    
    // store data in dataList 
    list.setAdapter(CustomAdapter(YourClass.this, dataList));
    

    最简单的解决方法是从 ListView 的适配器 remove 那些项目并调用 notifyDataSetChanged()。这将 remove the cells/row 列表中的那些项目。

     adapter.remove(object);
     adapter.notifyDataSetChanged(); // this will update your ListView
    

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

    【讨论】:

    • 对不起,我已经实现了我自己的适配器,它也从提供的 ArrayList 中删除项目。所以我不能对这个提议使用删除方法。实际上我需要编辑我的答案。
    • @Lingviston 更新了答案
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 2014-09-07
      • 2016-10-04
      • 2015-05-03
      相关资源
      最近更新 更多