Ошибка "Наблюдатель... не зарегистрирована"
Я работаю над Android-приложением, и когда я пытаюсь отображать большие объемы данных в listview
, я получаю следующую ошибку:
01-24 18:06:32.214:
INFO/System.out(9244):
EX:Observer [email protected]
was not registered.
Ответы
Ответ 1
Я тоже получил эту ошибку.
в моем случае это исключение (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)
Ответ 2
Я столкнулся с этой проблемой несколько раз при работе с listviews. Если вы используете пользовательский адаптер с включенным редактируемым текстом, вы должны сделать 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();
}
Ответ 3
Я столкнулся с той же проблемой, и это оказалось проблемой с потоками. Несколько потоков вызывали setAdapter
, которые, похоже, не являются потокобезопасными. Убедившись, что все вызовы setAdapter
выполняются в одном потоке, проблема была решена.
Что сработало для меня хорошо, было заставить мой код изменить его только на поток пользовательского интерфейса:
runOnUiThread(new Runnable() {
@Override
public void run() {
final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rc_view);
recyclerView.setAdapter(new MyAdapter(items));
}
});
Ответ 4
У меня тоже была эта проблема, и ответ на флуд помог мне решить ее. В моем случае ошибка появлялась бы всякий раз, когда я возвращался к своему приложению из другого, поэтому метод setAdapter всегда вызывался дважды.
Это помогло мне избежать этого:
if ( pager.getAdapter() == null ){
pager.setAdapter(pagerAdapter);
}
Спасибо!
Ответ 5
на фрагменте, который содержит Viewpager
@Override
public void onDestroyView() {
super.onDestroyView();
viewDestroyed = true;
}
затем перед установкой адаптера проверьте
if(viewDestroyed)
pager.setAdapter(adapter)
с наилучшими пожеланиями
Ответ 6
Просто переопределите в своем адаптере onGroupCollapsed.
Добавьте к вашему адаптеру:
@Override
public void onGroupCollapsed(int groupPosition) {
}