我要制作一个显示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。” < / p>
有什么想法吗?
PS:请原谅我的英语不好。答案 0 :(得分:3)
ListViews支持单个适配器中的多种类型的视图。
如果您覆盖adapter.getItemTypeCount
和adapter.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)
如果您在添加标题
之前已经设置了setAdapterif (listView.getHeaderViewsCount() == 0) {
ListAdapter adapter = listView.getAdapter();
listView.setAdapter(null);
listView.addHeaderView(aHeaderView);
listView.setAdapter(adapter);
}