Android 如何以编程方式将多个自定义线性布局添加到listView项

Android 如何以编程方式将多个自定义线性布局添加到listView项,android,android-layout,listview,Android,Android Layout,Listview,我有一个非常恼人的问题。我的任务是在一个ListView项中添加多个带有自定义XML模板(我不知道有多少个布局)的线性布局,每个模板中包含2个文本视图。 像这样: 是否可以在ArrayAdapter中执行此操作?任何帮助都将不胜感激 好的,我在乔纳斯·Cz的帮助下做了一些事情。 这就是我得到的 @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView =

我有一个非常恼人的问题。我的任务是在一个ListView项中添加多个带有自定义XML模板(我不知道有多少个布局)的线性布局,每个模板中包含2个文本视图。 像这样:

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

好的,我在乔纳斯·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);
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null)
{
convertView=充气机。充气(R.layout.parsed\u csv\u list\u view\u main\u项目,父项,false);
}
RealmResults titles=parentFragment.getParsedCSVtitles();
String[]parsedTitles=titles.get(0.getValues().split(“;”);
String[]parsedValues=items.get(position).getValues().split(“;”);
for(int i=0;i
我不得不将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(int位置、视图转换视图、视图组父视图){
if(convertView==null)
{
convertView=充气机。充气(R.layout.parsed\u csv\u list\u view\u main\u项目,父项,false);
}否则{
((LinearLayout)convertView).删除所有视图();
}
RealmResults titles=parentFragment.getParsedCSVtitles();
String[]parsedTitles=titles.get(0.getValues().split(“;”);
String[]parsedValues=items.get(position).getValues().split(“;”);
for(int i=0;i
在适配器的
getView()
方法中,为列表项展开主XML布局。然后,您应该在数据(数组、光标等)中循环,并为每个需要的额外线性布局创建它,添加文本视图,设置它们的文本,然后将其添加到从XML扩展的主布局中。看


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

另一种方法可能是在listView中放置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);
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null)
{
convertView=充气机。充气(R.layout.parsed\u csv\u list\u view\u main\u项目,父项,false);
}否则{
((LinearLayout)convertView).删除所有视图();
}
RealmResults titles=parentFragment.getParsedCSVtitles();
String[]parsedTitles=titles.get(0.getValues().split(“;”);
String[]parsedValues=items.get(position).getValues().split(“;”);
for(int i=0;i

它很难看,可能有点慢,但它可以工作。

您不需要多个布局,可以通过在一个布局中定义listView项的格式来实现xml@Apurva已定义listView项格式。问题是可能会有未知数量的文本视图,我需要对它们进行适当的定位。这个垫子不是答案,但你可以得到一些提示。下面是我如何以编程方式添加textView的,您是按原样使用ArrayAdapter还是扩展它?@JonasCz我使用的是从ArrayAdapter扩展而来的自定义适配器“如果您使用的是convertView参数中的视图(您应该这样做),您还必须确保在使用它之前主布局为空”您的意思是(如果convertView==null)?是的,如果您有类似于
convertView=LayoutFlater.inflate(R.layout.my_列表项)的内容在该
if
语句中