【问题标题】:Best way to build and handle List view with differing rows构建和处理具有不同行的列表视图的最佳方法
【发布时间】:2013-07-10 09:03:27
【问题描述】:

在我的应用程序中,我在列表视图中显示数据。它看起来如下。

列表视图中的每一行都是不同的(即,它们具有不同的视图结构)。但是每一行都由 1 到多个子视图组成(所有子视图都相同)。

问题:如果尝试从 xml 中扩充行,那么我需要使用 xml 1. 2 个子视图 2. 3个子视图 3. 5个子视图等等

如果我尝试动态构建行,那么我将无法利用持有者模式或 Listview 的视图可重用性。如果返回的视图中的子视图数量少于要求,我将最终构建子视图,或者在子视图超过要求的情况下删除。

简而言之,如何在不妨碍视图重用性或持有者模式的列表视图中拥有不同的视图?

编辑:

我扩展了 ArrayAdapter 并覆盖了 getView、getViewTypeCount、getItemViewType

@Override
public int getItemViewType(int position) {
    return mListItems.get(position).getViewToBeRenderened().getViewId();
}

@Override
public int getViewTypeCount() {     
    return AppConstants.VwViewTypes.values().length;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final VWListItem listItem = mListItems.get(position);
    if(listItem == null || listItem.getViewToBeRenderened() == null){
        return convertView;
    }       
    VWView renderingView = listItem.getViewToBeRenderened();

    if(convertView == null ){           
        convertView = renderingView.buildView(mContext.appContext);

    }

                ...
}

这种方法最初在只有 2-3 个不同的行视图时有效。对于这些行视图中的每一个,我都有一个不同的 xml 布局和相应的类来构建和膨胀。

但现在此类视图的数量正在增长,我不想为每个额外的新行视图都有一个布局和类。相反,我想重用现有的布局和类并在它们之上构建。如果有更好的解决方案,我也愿意接受。

【问题讨论】:

  • 连续最多需要多少个 A 视图?
  • 不会超过 8 个子视图

标签: android android-listview


【解决方案1】:

当您必须管理不同类型的视图时,您应该覆盖getViewTypeCount()getItemViewType(),您将收到与getViewTypeCount() 返回的int 数相等的convertViews。例如,如果它返回 2,您将获得 2 个不同的 convertView

【讨论】:

  • 没有得到最后一条语句“它返回 2 null convertView”。我已经覆盖了这些方法并正在适当地处理它。
  • 那我可能误解了你的问题?
  • 不明确。 ArrayAdapter 中列表中的项目知道要构建哪个视图。我想我在某个地方出错了
  • 假设你返回两种不同类型的视图,id 为 1 和 2。第一次 getViewTypeCount 返回 1 你得到 converView == null 并膨胀它,然后每次 getViewTypeCount 返回 1 你会得到一个 convertView !=空值。第一次 getViewTypeCount 返回 2 你将再次获得一个新的 convertView == null
  • 没错,这就是我的应用程序的工作方式。但是我没有在哪里显式调用 getViewTypeCount 或 getItemViewType,我已经覆盖了它们以便 android 传递适当的转换视图。
【解决方案2】:

当每一行都有相似的重复模式时,ListView 被认为是用来减轻编码人员的一些负担。是的,对于细微的变化,getViewType 是实施的正确选择,但我看到一个更好 解决您的问题的方法:如果您有很多自定义要求,您应该创建自己的线性布局。 请记住,listview 本身是一个昂贵的创建对象。创建自定义线性布局并不难。

【讨论】:

  • 怎么样?在一天结束时,我必须在列表视图中显示项目,我有数百个结果要显示
  • 我只看到图片中有 9 个子视图。如果您创建三个独立的列表视图,垂直堆叠在线性布局中,这不是您想要的解决方案吗?
  • 不,那行不通,对不起,我从图像中猜想我在列表视图中显示数据并不明显
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 2015-04-04
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多