1

我正在尋找Android中的最佳實現模式,以便在其中一個元素更改其他活動時更新列表。如何更新適配器列表中的元素一旦對其他Activity中的元素進行了更改?

想象一下用戶的旅程:

異步過程從Web服務器取十(10)接觸型材。這些被放置在一個數組中,並通知適配器。十(10)個聯繫人配置文件現在顯示在列表中。

用戶點擊聯繫人配置文件五(5)。它打開了一個活動,詳細介紹了此聯繫人配置文件。用戶決定他們喜歡它,然後點擊「添加到最愛」。這會觸發用戶已收到聯繫人配置文件五(5)的Web服務器的異步請求。

用戶點擊回來。現在再列出他們的名單。問題是這份名單現在已經過時,並沒有顯示五(5)個人資料被收錄。

你:

  • 異步調用的數據更新網絡服務器,並通知適配器刷新整個列表。這似乎是低效的,因爲列表的調用可能需要幾秒鐘。

  • 贊成配置文件存儲標記爲「刷新」的某個地方(可能在單件服務中)的對象。列表活動中的OnResume是否嗅探變量並更新列表中的該元素。

  • 確保列表數組是靜態可用的。從詳細信息活動更新數組。活動中的OnResume始終通知適配器進行刷新。

  • 確保列表數組和適配器是靜態可用的。更新數組並通過細節活動通知適配器。

還有其他的選擇嗎?這個最好的設計原則是什麼?

回答

0

異步調用Web服務器的更新數據並通知適配器 刷新整個列表。這似乎效率低下,因爲 列表的呼叫可能需要幾秒鐘。

正如你所說,這是非常低效的。在Android中創建一個對象是很昂貴的。創建許多對象列表要貴得多。

在favouriting配置文件存儲對象的地方(或許在 單服務)標記爲「刷新」。在的onResume列表活動 你嗅出變化和更新的列表只是元素。

這不是一個好的解決方案,因爲在刷新對象或應用程序被設備殺死之前,應用程序崩潰的可能性很大。

確保列表數組是靜態可用。從 詳細信息活動更新數組。活動中的OnResume始終通知適配器 進行刷新。

通過靜態方法或變量更新數組並不是一個好的解決方案,因爲它使您的詳細活動與列表結合在一起。此外,如果項目變大,則無法確保只有改變列表的詳細活動。

確保列表陣列和適配器是靜態可用。更新 數組並從詳細信息活動中通知適配器。

和上面一樣,靜態變量或對象是不行的。


你最好使用事件總線系統,如EventBus

每當你詳細活動點擊'add to favourite',發送異步請求,以更新最喜歡到Web服務器,併發送事件到列表中的活動更新的特定配置文件對象。例如,如果你的個人檔案編號「777」和輪廓進行了詳細的活動收藏最多,那麼你需要發送的事件這樣的事情在你的:

btnFavourite.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) {    
    // Send event when click favourite. 
    EventBus.getDefault.post(new RefreshProfileEvent(id, true); 
    } 
}); 

RefreshProfileEvent是一個簡單的POJO:

public class RefreshProfileEvent { 
    private String id; 
    private boolean isFavourited; 

    public RefreshProfileEvent(String id, boolean isFavourited) { 
    this.id = id; 
    this.isFavourited = isFavourited; 
    } 
    //getter and setter 
} 

然後你就可以收到事件在列表中的活動更新所選配置文件:

public class YourListActivity { 
    ... 
    @Override 
    protected onCreate() { 
    ... 
    EventBus.getDefault().register(this); 
    } 

    @Override 
    protected onDestroy() { 
    super.onDestroy(); 
    EventBus.getDefault().unregister(this); 
    } 

    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onMessageEvent(RefreshProfileEvent event) { 
    // Refresh specific profile 
    // For example, your profile is saved in List<Profile> mProfiles 

    // Search for profile by its id. 
    for(int i = 0; i < mProfiles.size(); i++) { 
     if(mProfiles.getId().equals(event.getId()) { 
     // Refresh the profile in the adapter. 
     // I assume the adapter is RecyclerView adapter named mAdapter 
     mProfiles.get(i).isFavourited(true); 
     mAdapter.notifyItemChanged(i); 
     // Stop searching. 
     break; 
    } 
    } 
} 

你並不需要等待作爲由服務器返回的yncTask請求結果。只要首先獲得個人資料並默默等待結果。如果您的請求成功,請不要做任何事情。但是,如果請求錯誤,使輪廓unfavourited和發送無礙的消息像小吃吧通知用戶。

+0

這是一個真正偉大的深入回答。謝謝。我以前沒有聽說過或使用過EventBus,但我現在肯定會開始使用它。 – user2694255

+0

不客氣。還有RxJava,但我之前沒有使用它。 –

0

第三個選項是最好的,當用戶更改詳細的數據活動數組應該改變,然後當使用返回到主要活動調用Adapter.notifyDataSetChanged();將做詭計

0

對於ArrayAdapter,notifyDataSetChanged只適用於在適配器上使用add(),insert(),remove()和clear()。

你可以做這樣的事情:

@Override 
protected void onResume() { 
    super.onResume(); 
    Refresh(); 
} 

public void Refresh(){ 
    items = //response.... 
    CustomAdapter adapter = new CustomAdapter(MainActivity.this,items); 
      list.setAdapter(adapter); 

     } 

在每個活動的onResume將刷新列表。希望它可以幫助你。

相關問題