2014-11-03 182 views
0

我正在構建一個應用程序,它是根據與服務器通信的Futuretask線程動態填充/清除數組列表。ArrayAdapter刷新數據

問題是,當我添加新的對象到我arrayadapter以任何方式我稱之爲notifyDataSetChangedsetNotifyOnChange

(例如添加項目之後,我也嘗試做一些postadd函數調用notifyDataSetChanged ,或者甚至試圖在適配器構造函數添加setNotifyOnChange,或添加之前(adapter.setNotifyOnChange(真))在此Futuretask它只是凍結線程,並導致應用程序故障)

。沒有notifyonchange當我滑動我的手指來調用ArrayAdapter的getView()它的作品,但這是一個不受歡迎的行爲。

注意:我正在通過靜態變量引用訪問適配器。

注意#2:我不認爲一遍又一遍地創建新的適配器是一個明智的選擇。

/編輯:

我的刪除方法是這樣的:

public void remove (int itemid) { 
     for (ContactItem i : items) 
      if (i.ID == itemid) 
       items.remove(i); 
    } 

(和它掛到底在最後pharantesis)

回答

0
  1. 使用靜態變量的引用意味着你應該仔細地在線程中。據我所知,適配器只在UI線程中更新數據。
  2. 你應該知道的另一件事是你應該實現getCount()函數來返回正確的數字。 我的列表視圖沒有更新我的數據時遇到問題。即使我觸發onDatasetChange()。我忘了利用getCount()函數
1
  1. 傳遞一個弱引用的活動在其他線程,這樣你就不會泄漏的環境。

    WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity); 
    
  2. 從該線程運行主活動的ui線程上的notify更新。

    final Activity activity = mRef_Activity.get(); 
        if(activity != null) 
         activity.runOnUiThread(new Runnable() { 
    
          @Override 
          public void run() { 
    
           ArrayAdapter<String> adapter = activity.getAdapter(); 
           adapter.notifyDataSetChanged(); 
    
          } 
         }); 
    

注意,如果你正在運行,而不是一個可調用或可運行的異步任務,你可以把在異步的postExecute的通知更新,因爲它是從主UI線程回調。

+0

你好,你的回答幫助我謝謝你,但我也遇到了非常奇怪的錯誤。我還添加了setNotifyOnChange(false);到適配器的構造函數,所以它不會被隱式調用,當我試圖添加/從列表中刪除,但仍然有時這種調用發生在我刪除和整個應用程序掛起時,當我點擊屏幕這就是我得到的。 – Smarty77 2014-11-04 21:39:30

+0

java.lang.IllegalStateException:適配器的內容已更改,但ListView未收到通知。確保適配器的內容不會從後臺線程修改,而只能從UI線程修改。確保您的適配器在其內容更改時調用notifyDataSetChanged()。[在ListView(2131427350,類android.widget.ListView)與Adapter(類censored.ui.adapters.ContactsAdapter)] – Smarty77 2014-11-04 21:39:54

+0

您提到的函數的文檔「如果設置爲false,調用者必須手動調用notifyDataSetChanged()這些更改反映在附加視圖中,默認值爲true,並調用notifyDataSetChanged()將該標誌重置爲true。「似乎需要在調用notifyDataSetChanged()之後重置它。 – NameSpace 2014-11-05 08:22:04