20

我有一个编辑文本字段和一个“搜索”按钮。当我点击搜索时,我必须显示一个列表视图,其中包含与在编辑文本中输入的值相对应的数据。我已经使用 addHeader() 在我的列表中添加了一个标题。当我第一次搜索时,我能够成功地在列表中显示数据。但是当我再次搜索时,我收到以下错误。

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);

我在哪里做错了?

4

10 回答 10

25

在 android 2.3 上,在 setAdapter 之后添加标头(即使您已提前添加,然后删除)将引发异常。要动态隐藏或显示标题,请使用 setVisibility()。如何?您可以看到隐藏标题视图

于 2014-03-01T07:20:09.840 回答
12

无法将标题视图添加到列表 - 已调用 setAdapter。您可以看到, myList.addHeaderView(header) 必须在 myList.setAdapter(adapter) 之前执行;

于 2013-10-25T08:27:18.730 回答
1

如果你android:entries在 xml 文件中的 ListView 中使用,它setAdapter()在 addHeaderView 之前调用的方法。所以android:entries从 xml 布局文件中的 ListView 中删除属性。这将是工作。

于 2015-04-06T08:48:33.483 回答
1

我今天遇到了同样的问题。我有多个 ListViews.. 使用第一个的信息,它构建下一个的列表,每个人都有 setAdapter。对我来说,最好的解决方案是把

setListAdapter(null);

在函数顶部,我在其中膨胀 Header。我希望这有帮助..

于 2014-12-02T13:31:12.407 回答
1

尝试这个..

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
于 2013-10-25T07:59:59.760 回答
1

您可以在设置适配器之前将 FrameLayout 添加为标题视图,并在 FrameLaypout 中动态添加/删除视图

于 2014-03-18T16:13:22.540 回答
1

android api 抛出异常。对于低于 KITKAT 的 API 级别,必须在 setAdapter() 方法之前调用 addHeader() 或 addFooter() 方法。

api文档中提到:

注意:首次引入时,只能在使用 setAdapter(ListAdapter) 设置适配器之前调用此方法。从 Build.VERSION_CODES.KITKAT 开始,可以随时调用此方法。如果 ListView 的适配器没有扩展 HeaderViewListAdapter,它将使用 WrapperListAdapter 的支持实例进行包装

于 2019-02-05T07:23:21.553 回答
0

我设置后

final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true); 

listView.setAdapter(adapter);

还是出现了问题。然后我制作了 Build > Clean Project。

于 2016-08-03T09:23:09.650 回答
-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);

我将我的适配器放入处理程序有时它发生适配器设置得更快然后查看所以这段代码足以让我解决这个异常。:)

于 2015-07-02T09:54:34.043 回答
-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);
于 2013-10-25T08:41:36.210 回答