观察者未注册错误。

13
我正在开发一款 Android 应用程序,当我试图在 listview 中显示大量数据时,会收到以下错误信息:
01-24 18:06:32.214: 
INFO/System.out(9244): 
  EX:Observer android.widget.AdapterView$AdapterDataSetObserver@43c9b200 
  was not registered.

1
有进展了吗?我也遇到了同样的问题。我不确定为什么outis告诉你在这里接受任何答案,当这里没有答案 :s - odiggity
6个回答

14

我也遇到了这个错误。
在我的情况下,因为我调用了以下代码而抛出了该异常 (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);
放在循环外部,以避免多次调用。 修复后不再抛出异常。 敬礼,flood。(fldr atincircle mail dot ru)

4

我曾经遇到过同样的问题,后来发现这是一个线程问题。多个线程同时调用setAdapter,这似乎不是线程安全的。确保所有的setAdapter调用都在同一线程上完成后,问题得以解决。

对我而言,有效的方法是强制我的代码只在UI线程上进行更改:

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

我也通过在UI线程上运行来修复它。只需将我的代码移动到run(){}中即可。 - lxknvlk

2

在处理列表视图时,我已经多次遇到这个问题。如果您正在使用包含编辑文本的自定义适配器,则需要在刷新适配器之前执行clearFocus()。当ListView删除具有活动焦点的子项时,将导致“Observer not registered”错误。

我的解决方法是:

这是我自定义适配器的视图持有者

class viewHolder {
    public viewHolder() {
        views = new ArrayList<viewInfo>();
    }

    public int position;
    public ArrayList<viewInfo> views;
    public View view;
}

然后我调用一个 unfocusAll() 函数,它包含以下内容:

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

在调用列表视图之前,您需要执行以下操作:
CustomAdapter aa = new CustomAdapter();
if (aa != null) {
  aa.unFocusAll();
}

很抱歉,您的代码示例不是很清晰。在您的unFocusAll()函数中,v是什么?此外,unFocusAll是CustomAdapter的一个方法吗?为什么您需要viewHolder类? - Kyle Falconer

0

在您的适配器中简单地重写 onGroupCollapsed 方法。

将以下内容添加到您的适配器中:

@Override
public void onGroupCollapsed(int groupPosition) {

}

0

我今天也遇到了这个问题,洪水的答案帮助我解决了它。在我的情况下,每当我从另一个应用程序切换回我的应用程序时,错误就会显示出来,因此方法setAdapter总是被调用两次。

这帮助我避免了这个问题:

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

谢谢!


0

在包含ViewPager的片段中

@Override
    public void onDestroyView() {
        super.onDestroyView();
        viewDestroyed = true;
    }

在设置适配器之前,请检查

if(viewDestroyed)
  pager.setAdapter(adapter)

最好的祝福


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接