6

Ich habe eine Menge Fragen zum selben Thema gefunden. Aber ich kann nicht herausfinden, was ich hier falsch mache.So beheben Sie "Der Inhalt des Adapters hat sich geändert, aber ListView hat keine Benachrichtigung erhalten" Ausnahme

Ausnahme: "Der Inhalt des Adapters hat sich geändert, aber ListView hat keine Benachrichtigung erhalten. Stellen Sie sicher, dass der Inhalt Ihres Adapters nicht von einem Hintergrundthread geändert wird, sondern nur vom Benutzeroberflächenthread "

Ich habe einen TextWatcher zu meiner AutoCompleteTextView. Ich versuche, die Dropdownliste zu aktualisieren, wenn sich der Text ändert. Ich hole Daten für den Drop-Down aus zwei verschiedenen Quellen. Und jeder von ihnen in verschiedenen Threads ausgeführt wird.

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) { 
      }      
     } 
    }; 

Und der Handler für den Adapter ist neben den 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(); 
    } 
} 

der gesamte Code oben ist innerhalb der Aktivität ist O nCreate() -Methode. Ich bekomme die Ausnahme nicht immer. Es passiert bei bestimmten Gelegenheiten. Dieses Problem wurde noch nicht gelöst. Ich habe die Methode notifydatasetchanged() nach der Erstellung des Adapters hinzugefügt. Trotzdem löst das das Problem nicht. Kann jemand darauf hinweisen, was ich hier falsch mache?

+0

Was ist der Sinn zu überprüfen, ob suggestionsAdapter null ist, nachdem Sie jedesmal einen neuen suggestionsAdapter erstellt haben? Ich bin nicht derjenige, der dies ablehnt, aber Ihr Code-Format kann schwer zu lesen sein ohne richtige Klammern. – Neoh

+0

Aktualisierte Frage – intrepidkarthi

+1

Versuchen Sie, suggestionsAdapter.notifyDataSetChanged() aufzurufen, nachdem Sie den neuen Adapter erstellt haben. – Neoh

Antwort

3

die Fehler behoben, durch

suggestionAdapter.notifyDataSetChanged(); 

auf, wenn die Liste geändert hinzugefügt wird, anstatt es nach einer n Anzahl von Einfügungen des Aufrufs.

Verwandte Themen