异步调用网络服务器获取更新数据并通知适配器
刷新整个列表。这似乎是低效的呼吁
列表可能需要几秒钟。
正如你所说,它非常低效。在 Android 中创建一个对象是昂贵的。创建一个包含许多对象的列表要昂贵得多。
在收藏配置文件时将对象存储在某处(可能在
单例服务)标记为“刷新”。 List 活动中的 OnResume
你会嗅探变量并只更新列表中的那个元素吗?
这不是一个好的解决方案,因为在我们刷新对象之前应用程序可能会崩溃,或者应用程序被设备杀死。
确保列表数组是静态可用的。从更新数组
详细活动。 Activity 中的 OnResume 总是通知适配器
刷新一下。
通过静态方法或变量更新数组不是一个好的解决方案,因为它会使您的详细 Activity 与列表耦合。此外,如果您的项目变得更大,您无法确保只有更改列表的详细活动。
确保列表数组和适配器是静态可用的。更新
数组并从详细活动通知适配器。
同上,静态变量或对象是不行的。
你最好使用像EventBus这样的事件总线系统。
每当您单击'add to favourite' 详细活动时,将更新收藏夹的异步请求发送到 Web 服务器,并将事件发送到列表活动以更新特定的配置文件对象。例如,如果您的个人资料的 id 为“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;
}
}
}
您无需等待服务器返回的 AsyncTask 请求结果。只需将个人资料设为首选,然后静静地等待结果。如果您的请求成功,请不要执行任何操作。但如果请求错误,则将配置文件设为不受欢迎,并发送 SnackBar 等无障碍消息通知用户。