adapter 的notifyDataChanged()必須在UI thread 中呼叫, 如果不是, 例如, 如果在adapter中, 自行呼叫 notifyDataChanged() 將會造成許多問題, 例如, 按鍵無法接受。在我的個案中,按鍵無法接受,不管是長按或是短按,但是,滑動光學滑鼠之後,就正常了,查網,的確有這個問題。
http://stackoverflow.com/questions/4566101/how-to-fix-notifydatasetchanged-listview-problems-in-dynamic-adapter-wrapper-and
解決的方法是使用AsyncTask, 例如:
class AppendTask extends AsyncTask<Integer, Float, Exception> {
@Override
protected void onPreExecute() {
... run in UI thread
return float-value;
}
@Override
protected Exception doInBackground(Integer... params) {
...
... run in WORKING thread
...publishProgress(a,b,c);
}
@Override
protected void onProgressUpdate(Float progress) {
...run in UI thread
}
@Override
protected void onPostExecute(Exception e) {
... run in UI thread
}
AsyncTask 的三個參數中,第一個參數(Integer), 是doInBackground()的輸入參數類別,是不定個數的參數。第二個參數(Float) 是onProgressUpdate的輸入參數類別,也是不定個數。第三個參數(如例中之Exception)則為doInBackground的傳回值類別,也是onPostExecute()的輸入類別。
四個函數,只有doInBackground在Working thread(沒有UI的thread)中執行,onPreExecute()第一個被執行,接著就執行doInBackground(), 這是不能省略的函數,在函數中可呼叫(也可以不呼叫)onProgressUpdate一次或多次。onPostExecute()則是在doInBackground結束後執行。
沒有留言:
張貼留言