2011-01-24 19 views
13

私は、Androidアプリケーションに取り組んでいる、と私はlistviewに大量のデータを表示しようとしたとき、私は、次のエラーが表示さ:「オブザーバー...登録されていません」というエラー

01-24 18:06:32.214: 
INFO/System.out(9244): 
    EX:Observer [email protected] 
    was not registered. 
+1

これで運を?私は同じ問題を抱えています。回答がないときに、ここで回答を受け入れるように指示している理由はわかりません: – odiggity

答えて

13

をIこのエラーもあります。私は

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 at mail mail dot ru)

+6

この問題をどのように修正しますか? –

1

私はこの問題をlistviewsを扱うときに何回も遭遇しました。編集テキストを含むカスタムアダプターを使用している場合は、アダプターをリフレッシュする前にclearFocus()を実行する必要があります。これはその後、私はunfocusAllを呼び出す

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

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

私のカスタム・アダプターのためのビューホルダー(ある :登録されていないオブザーバーは、私はそれを行う方法の活動

に焦点を当てた子を削除するリストビューによって引き起こされます)で構成されている:あなたはあなたのリストビューを呼び出す前に、

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

だから、

CustomAdapter aa = new CustomAdapter(); 
if (aa != null) { 
    aa.unFocusAll(); 
} 
をしなければなりません
+0

あなたのコード例があまり明確でないのを恐れています。 unFocusAll()関数で、vとは何ですか?さらに、unFocusAllはCustomAdapterのメソッドですか?なぜviewHolderクラスが必要なのでしょうか? –

0

私も今日この問題を抱えており、洪水の答えが私の解決に役立った。私の場合は、別のアプリケーションから私のアプリケーションに切り替えたときにエラーが表示されるので、setAdapterメソッドは常に2度呼び出されます。

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

感謝を:

これは私がそれを避ける助けました!

1

私は同じ問題に直面し、スレッドの問題であることが判明しました。複数のスレッドがスレッドセーフではないように見えるsetAdapterを呼び出していました。すべてのsetAdapter呼び出しが同じスレッドで行われたことを確認した後、問題は解決されました。私のためにうまく働いていた何

は、唯一のUIスレッド上で、それを変更するために自分のコードを強制することでした:Viewpager
@Override
ます。public void onDestroyView()を含むフラグメント{

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

私はまた、UIスレッドで実行して修正しました。私のコードをrun(){}の中に移動するだけです – lxknvlk

0

スーパー。onDestroyView();
viewDestroyed = true;あなたのアダプタで
その後、 }

(viewDestroyed)
pager.setAdapter(アダプタ)場合は、アダプタのチェック
を設定する前に

よろしく

0

単にオーバーライドをonGroupCollapsed。

は、アダプターに入れる:

@Override 
public void onGroupCollapsed(int groupPosition) { 

} 
関連する問題