1

我必须制作一个显示有关 F1 比赛信息的应用程序。为了显示这些信息,我使用了ListView几个SimpleAdapters显示不同数据集(一个位置、名称、时间;每个扇区时间另一个......)的信息。

adaptadorPortrait1 = new SimpleAdapter(
    getApplicationContext(),
    lista_adaptador,
    R.layout.portrait1,
    new String[] {"pos", "short_name", "time_total", "time_pred"},
    new int[] {R.id.pos, R.id.name, R.id.time,R.id.prev});
adaptadorPortrait2 = new SimpleAdapter(
    getApplicationContext(),
    lista_adaptador,
    R.layout.portrait2,
    new String[] {"pos", "short_name", "sect1","sect1","sect3"},
    new int[] {R.id.pos, R.id.name, R.id.psect, R.id.ssect, R.id.tsect});
 [...]

当某些事件发生时,例如在屏幕上切手指或旋转手机,我会更改列表适配器。

现在我想在列表中添加一个标题以指示每列是什么,并且我需要这个标题在适配器发生变化的同时发生变化。我曾尝试使用“addHeaderView”方法,但应用程序失败并抛出IllegalStateException消息 “无法将标题视图添加到列表 - 已调用 setAdapter”。

有任何想法吗?

PS:请原谅我的英语不好。

4

3 回答 3

3

ListViews 在单个适配器中支持多种类型的视图。

如果您覆盖adapter.getItemTypeCountandadapter.getItemType(int position)方法,您可以添加与其余视图一致的标题。因此,每个适配器中的第一项将是您的“标题”类型的视图(可能是简单的TextView),其余的可能是您的列表条目。

您只需要确保getItemType根据位置(对于标题为 0)是否为标题返回不同的数字。

public static final int TYPE_HEADER = 0;
public static final int TYPE_CONTENT = 1;

public int getItemTypeCount(){
     return 2;
}

public int getItemType(int position){
    if(position == 0){
        return TYPE_HEADER;
    } else {
        return TYPE_CONTENT;
    }
}

public View getView(int position, View convertView, ViewGroup parent){
    // make sure that from here, you return the right kind of view based on getItemType(position)
    // you are guaranteed that if a convertView is passed to you (convertView != null)
    // that the convertView is of the appropriate type.

    int type = getItemType(position);
    if(type == TYPE_HEADER){
        // create (or reuse) and return a header view
    } else {
        // create (or reuse) and return a content view
    }

    return myView;

}
于 2012-04-14T18:48:40.800 回答
0

您得到的错误是由于页眉和页脚的工作方式;该列表创建了一个具有页眉和页脚的中间适配器,因此您需要在调用addHeaderView() 之前调用setAdapter()。这意味着你不能做你想做的事。您可以尝试其他方法,例如使用两个单独的 s 并根据您要显示ListView的来调用。setVisibility()

于 2012-04-14T18:36:33.687 回答
0

如果您在想添加标头之前已经设置了适配器

if (listView.getHeaderViewsCount() == 0) {
     ListAdapter adapter = listView.getAdapter();
     listView.setAdapter(null);
     listView.addHeaderView(aHeaderView);
     listView.setAdapter(adapter);
 }
于 2013-08-28T03:14:37.583 回答