Ответ 1
В Android 2.3 добавьте заголовок после setAdapter (даже если вы добавили раньше, а затем удалили) генерирует исключение. Чтобы скрыть или показать заголовок динамически, используйте setVisibility(). Как? Вы можете видеть Скрытие заголовков.
У меня есть одно поле 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);
Где я ошибаюсь?
В Android 2.3 добавьте заголовок после setAdapter (даже если вы добавили раньше, а затем удалили) генерирует исключение. Чтобы скрыть или показать заголовок динамически, используйте setVisibility(). Как? Вы можете видеть Скрытие заголовков.
Невозможно добавить заголовок в список - setAdapter уже вызван. который вы можете видеть, myList.addHeaderView(заголовок) должен быть выполнен до myList.setAdapter(адаптер);
Попробуйте это.
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
вы можете добавить FrameLayout в виде заголовка перед настройкой адаптера и динамически добавлять/удалять вид в FrameLaypout
У меня была такая же проблема сегодня. У меня есть несколько ListViews. С информацией из первого, он строит список следующего, и у всех есть setAdapter в нем. Для меня лучшим решением было поставить
setListAdapter(null);
поверх функции, где я раздуваю заголовок. Надеюсь, это поможет.
Если вы использовали android:entries
в ListView в xml файле, его называли setAdapter()
методом до addHeaderView. Поэтому удалите атрибут android:entries
из списка ListView в файле макета xml. Это будет работа.
После того, как я установил
final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true);
перед
listView.setAdapter(adapter);
проблема все еще появилась. Затем я создал Build > Clean Project.
Исключение выдает Android api. Для API уровня ниже KITKAT метод addHeader() или addFooter() должен быть вызван перед методом setAdapter().
Упоминается в документации API:
Примечание. При первом представлении этот метод можно было вызвать только перед настройкой адаптера с помощью setAdapter (ListAdapter). Начиная с Build.VERSION_CODES.KITKAT, этот метод может быть вызван в любое время. Если адаптер ListView не расширяет HeaderViewListAdapter, он будет обернут вспомогательным экземпляром WrapperListAdapter.
После стольких усилий я получил решение для своей стороны Я надеюсь, что это тоже поможет кому-то.
Я уже установил 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);
Я помещаю адаптер в обработчик, когда-то это случается, что адаптер устанавливается быстрее, чем просмотр, поэтому этот код достаточно для меня, чтобы решить это исключение.:)
Я использовал следующий код в своем примере приложения для установки заголовка 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);