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

Я работаю над 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) {

}