6
我發現很多關於同一主題的問題,但我無法弄清楚我在這裏做錯了什麼,如何解決「適配器的內容已經改變,但ListView沒有收到通知」異常
異常: 「適配器的內容已更改,但ListView未收到通知。確保您的適配器的內容不是從後臺線程修改,但只能從UI線程」
我有一個TextWatcher我AutoCompleteTextView。我想,當文本的變化。我獲取更新的下拉列表用於下拉從兩個不同的源,而且不同的線程中運行它們中的每一個數據。
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();
}
}
整個代碼以上是在Activity的O中nCreate()方法。我總是沒有例外。它發生在特定的場合。此問題尚未解決。在創建適配器後,我添加了notifydatasetchanged()方法。仍然不能解決問題。任何人都可以指出我在這裏做錯了嗎?
每次創建一個新的suggestionAdapter後,檢查suggestionAdapter是否爲空值是什麼?我並不是那種低估了這一點的人,但是如果沒有適當的支架,你的代碼格式可能很難閱讀。 – Neoh
更新的問題 – intrepidkarthi
嘗試在創建新適配器後調用suggestionAdapter.notifyDataSetChanged() – Neoh