我有一个edittext字段和一个“搜索”按钮。当我点击搜索时,我必须显示一个列表视图,其中包含与edittext中输入的值相对应的数据。我使用addHeader()在列表中添加了一个标题。当我第一次搜索时,我能够成功地在List中显示数据。但是当我再次搜索时,我收到以下错误。
FATAL EXCEPTION: main
java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
at android.widget.ListView.addHeaderView(ListView.java:261)
at android.widget.ListView.addHeaderView(ListView.java:284)
在设置适配器之前,我已将标题分配给我的列表。
以下是我的代码:
myList = (ListView) findViewById(R.id.searchResultsList);
View header = View.inflate(this, R.layout.search_results_header, null);
myList.addHeaderView(header, null, false);
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.setAdapter(dataAdapter);
我做错了什么?
答案 0 :(得分:25)
在android 2.3上,在setAdapter之后添加标题(即使你已经提前添加,然后删除)也会抛出异常。要动态隐藏或显示标题,请使用setVisibility()。怎么样?你可以看到Hiding header views。
答案 1 :(得分:12)
无法将标题视图添加到列表中 - 已调用setAdapter。 你可以看到,myList.addHeaderView(标题)必须先执行 myList.setAdapter(适配器);
答案 2 :(得分:1)
试试这个..
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
答案 3 :(得分:1)
您可以在设置适配器之前将FrameLayout添加为标题视图,并在FrameLaypout中动态添加/删除视图
答案 4 :(得分:1)
我今天遇到了同样的问题。我有多个ListViews ..使用第一个的信息,它构建下一个的列表,每个人都有setAdapter。 对我来说,最好的解决方案是放
setListAdapter(null);
在函数的顶部,我在那里给页眉充气。我希望这会有所帮助..
答案 5 :(得分:1)
如果在xml文件中的ListView中使用了android:entries
,则在addHeaderView之前调用它setAdapter()
方法。因此,从xml布局文件中的ListView中删除android:entries
属性。这将是有效的。
答案 6 :(得分:0)
我设置
之后final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true);
前
listView.setAdapter(adapter);
问题仍然存在。然后我做了Build>清洁项目。
答案 7 :(得分:0)
android api抛出异常。对于低于KITKAT的API级别,必须在setAdapter()方法之前调用addHeader()或addFooter()方法。
api文档中提到了它:
答案 8 :(得分:-1)
经过这么多的努力,我得到了解决方案 我希望这也会对某人有所帮助
我已经在最后设置了adpater(在添加视图之后),但是不知道为什么我从同样的错误中产生了什么,所以在这里我做了类似这样的代码
// Set View here
View view = getLayoutInflater().inflate(R.layout.navigation_header,null);
mDrawerList.addHeaderView(view);
// init your adapter
adapter1 = new YourListAdapter(getApplicationContext(),blabla);
// set adapter into handler
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mDrawerList.setAdapter(adapter1);
}
}, 100);
我把我的适配器放到处理程序中,有时它发生的适配器设置更快然后查看所以这段代码足以让我解决这个异常。 :)
答案 9 :(得分:-2)
我在示例应用程序中使用了以下代码来设置ListView标头:
ListView lv = getListView();
View headerView = getLayoutInflater().inflate(R.layout.layout_header, null, false);
lv.addHeaderView(headerView);
final TumblrDB db = new TumblrDB(this);
c = db.query();
startManagingCursor(c);
adapter = new CustomCursorAdapter(this, R.layout.layout_del, c, new String[]{TumblrDB.DATE, TumblrDB.DESC}, new int[]{R.id.txt_a, R.id.txt_b});
lv.setAdapter(adapter);