6

同じトピックについて多くの質問がありましたが、ここで間違っていることがわかりません。解決方法「アダプタの内容は変更されましたが、ListViewは通知を受け取りませんでした」例外

例外: "アダプタの内容は変更されましたが、ListViewは通知を受け取りませんでした。あなたのアダプターの内容は、UIスレッドからのみ、バックグラウンドスレッドから変更されていないことを確認してください。 "

TextComponentをAutoCompleteTextViewに持っています。テキストが変更されたときにドロップダウンリストを更新しようとしています。 2つの異なるソースからのドロップダウンのためのデータ及び異なるスレッド内で実行されているそれらのそれぞれ。

mTextWatcher = new TextWatcher() { 
     public void afterTextChanged(Editable editable) {   
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
     } 

     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      suggestionNewText = s.toString(); 
      list = new ArrayList<Map<String, String>>(); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //data processing 
        list.add(data); 
        handler.sendEmptyMessage(1); 
          } 
         }); 

      Thread webAutoComplete = new Thread(new Runnable() { 
         @Override 
         public void run() { 
           //data process 
           list.add(data); 
           handler.sendEmptyMessage(1); 
      } 
      }); 

      try { 
        webAutoComplete.start(); 
       } catch (NullPointerException e) { 
       } catch (IllegalStateException e) { 
      }      
     } 
    }; 

とアダプタのハンドラはtextwatcherの隣にある。

handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case 1: { 

       ((Activity) CONTEXT).runOnUiThread(new Runnable() { 
        public void run() { 
         try { 
          if (list != null) 

          suggestionAdapter = new UrlSuggestionAdapter(
            CONTEXT, 
            list, 
            R.layout.two_line_autocomplete, 
            new String[] { "title", "url" }, 
            new int[] { R.id.title, R.id.url 
              }); 
          if (list != null) { 
           refreshAdapter(list); 
           getUrl.setAdapter(suggestionAdapter); 

          } 

         } catch (Exception e) { 

         } 
        } 
       }); 
       break; 
      } 
      case 2: { 
       break; 
      } 
      } 
     } 
    }; 



public synchronized void refreshAdapter(List<Map<String, String>> items) { 

    list = items; 
    if (list != null) { 

     suggestionAdapter.notifyDataSetChanged(); 
    } 
} 

上記全体のコードであります活動の中のO nCreate()メソッド。私は例外を常に得ることはありません。それは特定の機会に起こります。この問題はまだ解決されていません。アダプタの作成後にnotifydatasetchanged()メソッドを追加しました。それでも問題は解決しません。誰でも私がここで間違っていることを指摘できますか?

+0

いつでも新しいsuggestionAdapterを作成した後、suggestionAdapterがnullであるかどうかを確認するポイントは何ですか?私はこれを下降させる人ではありませんが、あなたのコードフォーマットは適切な角括弧なしでは読みにくい場合があります。 – Neoh

+0

質問が更新されました – intrepidkarthi

+1

新しいアダプタを作成した後、suggestionAdapter.notifyDataSetChanged()を呼び出してみてください – Neoh

答えて

3

リストを挿入N個の後に呼び出すのではなく、変更されるたびに

suggestionAdapter.notifyDataSetChanged(); 

を添加することによってエラーを修正しました。