2015-02-10 109 views
4

我有一个相当恼人的问题。我的任务是添加多个LinearLayouts与自定义XML模板(我不知道有多少布局可能)与2个TextViews内(每个)到1个ListView项目。 像这样的:enter image description here如何以编程方式将多个自定义linearLayouts添加到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); 
    } 
+0

您不需要多个布局,您可以通过在一个xml中定义listView项目的格式来执行此操作。 – Apurva 2015-02-10 11:17:39

+0

@Apurva listView项目格式已定义。问题是可能存在数量未知的TextView,我需要将它们适当地放置 – Rishka 2015-02-10 11:20:43

+0

这垫子不是答案,但可以获得一些提示。以下是我如何以编程方式添加textView,http://www.uploadbaz.com/m9bb9xokn97t – Apurva 2015-02-10 11:38:25

回答

2

在适配器的getView()方法,你夸大列表项的主要XML布局。然后你应该循环你的数据(数组,光标,不管),并为每个你想要的额外的LinearLayout,创建它,并添加TextViews,设置他们的文本,并将其添加到你从XML膨胀的主布局。见this answer

如果重新使用从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); 
} 

这是丑陋的,而且很可能稍显迟缓,但它的作品。

+0

“如果要重新使用convertView参数(您应该这样做)的视图,还必须确保主布局在使用前是空的”by this you mean(if convertView == null)? – Rishka 2015-02-10 12:36:01

+0

是的,如果你有类似'convertView = LayoutInflater.inflate(R.layout.my_list_item);'在那个'if'语句中 – JonasCz 2015-02-10 12:44:11

相关问题