Подтвердить что ты не робот

Невозможно добавить заголовок в список - setAdapter уже вызван

У меня есть одно поле edittext и одна кнопка поиска. Когда я нажимаю на поиск, я должен отображать представление списка с данными, соответствующими значениям, введенным в edittext. Я добавил заголовок в свой список, используя 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);

Где я ошибаюсь?

4b9b3361

Ответ 1

В Android 2.3 добавьте заголовок после setAdapter (даже если вы добавили раньше, а затем удалили) генерирует исключение. Чтобы скрыть или показать заголовок динамически, используйте setVisibility(). Как? Вы можете видеть Скрытие заголовков.

Ответ 2

Невозможно добавить заголовок в список - setAdapter уже вызван. который вы можете видеть, myList.addHeaderView(заголовок) должен быть выполнен до myList.setAdapter(адаптер);

Ответ 3

Попробуйте это.

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();

Ответ 4

вы можете добавить FrameLayout в виде заголовка перед настройкой адаптера и динамически добавлять/удалять вид в FrameLaypout

Ответ 5

У меня была такая же проблема сегодня. У меня есть несколько ListViews. С информацией из первого, он строит список следующего, и у всех есть setAdapter в нем. Для меня лучшим решением было поставить

setListAdapter(null);

поверх функции, где я раздуваю заголовок. Надеюсь, это поможет.

Ответ 6

Если вы использовали android:entries в ListView в xml файле, его называли setAdapter() методом до addHeaderView. Поэтому удалите атрибут android:entries из списка ListView в файле макета xml. Это будет работа.

Ответ 7

После того, как я установил

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

перед

listView.setAdapter(adapter);

проблема все еще появилась. Затем я создал Build > Clean Project.

Ответ 8

Исключение выдает Android api. Для API уровня ниже KITKAT метод addHeader() или addFooter() должен быть вызван перед методом setAdapter().

Упоминается в документации API:

Примечание. При первом представлении этот метод можно было вызвать только перед настройкой адаптера с помощью setAdapter (ListAdapter). Начиная с Build.VERSION_CODES.KITKAT, этот метод может быть вызван в любое время. Если адаптер ListView не расширяет HeaderViewListAdapter, он будет обернут вспомогательным экземпляром WrapperListAdapter.

Ответ 9

После стольких усилий я получил решение для своей стороны Я надеюсь, что это тоже поможет кому-то.

Я уже установил 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);

Я помещаю адаптер в обработчик, когда-то это случается, что адаптер устанавливается быстрее, чем просмотр, поэтому этот код достаточно для меня, чтобы решить это исключение.:)

Ответ 10

Я использовал следующий код в своем примере приложения для установки заголовка 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);