異步調用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和發送無礙的消息像小吃吧通知用戶。
這是一個真正偉大的深入回答。謝謝。我以前沒有聽說過或使用過EventBus,但我現在肯定會開始使用它。 – user2694255
不客氣。還有RxJava,但我之前沒有使用它。 –