Ошибка «Наблюдатель … не зарегистрирована»

Я работаю над приложением Android, и когда я пытаюсь отображать большие объемы данных в listview , я получаю следующую ошибку:

 01-24 18:06:32.214: INFO/System.out(9244): EX:Observer android.widget.AdapterView$AdapterDataSetObserver@43c9b200 was not registered. 

Я тоже получил эту ошибку.
В моем случае это исключение (Observer * не было зарегистрировано.) Было брошено, потому что я вызвал

 setAdapter(Adapter) 

много раз.

например:

 MyAdapter (extends BaseAdapter) vla; ListView lv; for (int i = 0; i < 2; i++) { vla.clear(); vla.add(tv); lv.setAdapter(vla); } 

Исправлено здесь место
v.setAdapter(vla);
Вне цикла, тем самым избегая нескольких вызовов.

После исправления больше исключений исключений.
С наилучшими пожеланиями, наводнения. (Fldr atincircle mail dot ru)

Я столкнулся с этой проблемой несколько раз, имея дело со списками. Если вы используете пользовательский адаптер с включенным редактируемым текстом, вам нужно сделать clearFocus () перед обновлением адаптера. Наблюдатель, не зарегистрированный, вызван списком, удаляющим ребенка, который фокусируется на активности

Как я это делаю: это держатель для моего адаптера

 class viewHolder { public viewHolder() { views = new ArrayList<viewInfo>(); } public int position; public ArrayList<viewInfo> views; public View view; } 

После чего я вызываю unocusAll (), который состоит из:

 public void unFocusAll() { viewHolder holder = (viewHolder) v.getTag(); if (holder != null) { holder.view.clearFocus(); } } 

Поэтому перед тем, как вы вызовете свой список, вам нужно сделать

 CustomAdapter aa = new CustomAdapter(); if (aa != null) { aa.unFocusAll(); } 

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

Что сработало для меня хорошо, было заставить мой код изменить его только в потоке пользовательского интерфейса:

 runOnUiThread(new Runnable() { @Override public void run() { final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rc_view); recyclerView.setAdapter(new MyAdapter(items)); } }); 

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

Это помогло мне избежать этого:

 if ( pager.getAdapter() == null ){ pager.setAdapter(pagerAdapter); } 

Благодаря!

В фрагменте, который содержит Viewpager
@Override
Public void onDestroyView () {
super.onDestroyView ();
ViewDestroyed = true;
}

Затем перед установкой проверки адаптера
если (viewDestroyed)
pager.setAdapter (адаптер)

с наилучшими пожеланиями

Просто переопределите в своем адаптере onGroupCollapsed .

Добавьте к вашему адаптеру:

 @Override public void onGroupCollapsed(int groupPosition) { }