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

Ris*_*hka 5 android listview android-layout

我有一个很烦人的问题。我的任务是使用自定义XML模板(而且我不知道可以有多少个Layout)将多个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);
}
Run Code Online (Sandbox Code Playgroud)

我不得不将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);
   }
Run Code Online (Sandbox Code Playgroud)

Jon*_*ica 3

getView()适配器的方法中,您可以扩充列表项的主 XML 布局。然后,您应该循环遍历您的数据(数组、光标等),并为您想要的每个额外的 LinearLayout 创建它,并添加 TextView,设置它们的文本,并将其添加到您从 XML 扩充的主布局中。看到这个答案

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

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

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

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