动态ListView标头

时间:2012-04-14 17:16:27

标签: android android-listview

我要制作一个显示F1比赛信息的应用程序。为了显示这些信息,我使用了ListViewSimpleAdapters来显示不同的数据集(一个位置,名称,时间;另一个每个扇区时间......)。

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。” < / p>

有什么想法吗?

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

3 个答案:

答案 0 :(得分:3)

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

如果您覆盖adapter.getItemTypeCountadapter.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;

}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您在添加标题

之前已经设置了setAdapter
if (listView.getHeaderViewsCount() == 0) {
     ListAdapter adapter = listView.getAdapter();
     listView.setAdapter(null);
     listView.addHeaderView(aHeaderView);
     listView.setAdapter(adapter);
 }