如何以编程方式将多个自定义 linearLayouts 添加到 listView 项目

How to add multiple custom linearLayouts programmatically to listView item

我有一个非常恼人的问题。我的任务是使用自定义 XML 模板(而且我不知道可能有多少布局)添加多个 LinearLayouts,其中(每个)有 2 个 TextViews 到 1 个 ListView 项目中。 像这样:

是否可以在 ArrayAdapter 中执行此操作?任何帮助将不胜感激!

好的,在 Jonas Cz 的帮助下,我设法做了一些事情。 这就是我得到的。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
    {
        convertView = inflater.inflate(R.layout.parsed_csv_list_view_main_item, parent, false);
    }
    RealmResults<ParsedCSV> titles = parentFragment.getParsedCSVtitles();
    String[] parsedTitles = titles.get(0).getValues().split(";");
    String[] parsedValues = items.get(position).getValues().split(";");

    for (int i = 0; i < parsedValues.length; i++) {
        View holder = inflater.inflate(R.layout.parsed_csv_list_view_subitem, parent, false);
        TextView textViewTitles = (TextView) holder.findViewById(R.id.parsed_csv_list_view_subitem_text_title);
        TextView textViewValues = (TextView) holder.findViewById(R.id.parsed_csv_list_view_subitem_text_value);
        textViewTitles.setText(parsedTitles[i]);
        textViewValues.setText(parsedValues[i]);
        ((LinearLayout) convertView).addView(holder);
    }
    return ((View)convertView);
}

我不得不将我的 convertView 转换为 LinearLayout,因为只有 converView 没有 addView 方法。好吧,这很糟糕,但它可以工作......有一些问题。 现在,在滚动时,列表中的项目数量似乎由于某种原因增加了。有人可以向我解释为什么会发生这种情况以及如何解决它吗?

来自 JonasCz 的完整工作解决方案:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
    {
        convertView = inflater.inflate(R.layout.parsed_csv_list_view_main_item, parent, false);

    } else {
        ((LinearLayout) convertView).removeAllViews();
    }
    RealmResults<ParsedCSV> titles = parentFragment.getParsedCSVtitles();
    String[] parsedTitles = titles.get(0).getValues().split(";");
    String[] parsedValues = items.get(position).getValues().split(";");

    for (int i = 0; i < parsedValues.length; i++) {
       View holder = inflater.inflate(R.layout.parsed_csv_list_view_subitem, parent, false);
       TextView textViewTitles = (TextView) holder.findViewById(R.id.parsed_csv_list_view_subitem_text_title);
       TextView textViewValues = (TextView) holder.findViewById(R.id.parsed_csv_list_view_subitem_text_value);
       textViewTitles.setText(parsedTitles[i]);
       textViewValues.setText(parsedValues[i]);
       ((LinearLayout) convertView).addView(holder);
     }
    return ((View)convertView);
   }

在适配器的 getView() 方法中,您为列表项扩充主 XML 布局。然后你应该遍历你的数据(数组,游标,等等)和你想要的每个额外的 LinearLayout,创建它,添加 TextViews,设置它们的文本,并将它添加到你从 XML 膨胀的主布局。参见 this answer

如果您要重新使用来自 convertView 参数的视图(您应该这样做),您还必须确保在使用它之前您的主布局是空的,您可以使用myMainListItemLayout.removeAllViews()

另一种方法可能是在列表视图中放置一个列表视图。 (可能不是一个好主意。)

编辑:尝试按如下方式更改您的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
    {
        convertView = inflater.inflate(R.layout.parsed_csv_list_view_main_item, parent, false);

    } else {
       ((LinearLayout) convertView).removeAllViews();
       }
    RealmResults<ParsedCSV> titles = parentFragment.getParsedCSVtitles();
    String[] parsedTitles = titles.get(0).getValues().split(";");
    String[] parsedValues = items.get(position).getValues().split(";");

    for (int i = 0; i < parsedValues.length; i++) {
        View holder = inflater.inflate(R.layout.parsed_csv_list_view_subitem, parent, false);
        TextView textViewTitles = (TextView) holder.findViewById(R.id.parsed_csv_list_view_subitem_text_title);
        TextView textViewValues = (TextView) holder.findViewById(R.id.parsed_csv_list_view_subitem_text_value);
        textViewTitles.setText(parsedTitles[i]);
        textViewValues.setText(parsedValues[i]);
        ((LinearLayout) convertView).addView(holder);
    }
    return ((View)convertView);
}

它很丑,而且可能有点慢,但它确实有效。