0

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

在此处输入图像描述

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

问题:如果尝试从 xml 膨胀行,那么我需要 xml 有 1. 2 个子视图 2. 3 个子视图 3. 5 个子视图等等

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

简而言之,如何在不妨碍视图重用性或持有者模式的 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 布局和相应的类来构建和膨胀。

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

4

2 回答 2

4

当您必须管理不同类型的视图时,您应该覆盖getViewTypeCount()并且getItemViewType()您将收到许多 convertViews 等于返回的 int getViewTypeCount()。例如,如果它返回 2 你将得到 2 differents convertView

于 2013-07-10T09:06:31.363 回答
0

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

于 2013-07-10T09:21:13.383 回答