diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b268ef3..cc6abec 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,6 +4,14 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java
index 455723a..10e914d 100644
--- a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java
+++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java
@@ -146,17 +146,30 @@
MutableLiveData> userActivitiesLiveData = friendToActivitiesLiveData.get(userId);
assert userActivitiesLiveData != null;
+ // 常に最新のアクティビティで上書きする。
+ //
+ // 以前は「ID・テキスト・更新時刻が完全一致している場合は更新をスキップ」することで
+ // LiveData の無駄な更新を抑制していたが、バックエンドの実装やデータ形式の違いにより
+ // 期待どおりに差分検知ができていない可能性がある。
+ //
+ // ここでは挙動の確実性を優先し、サーバから最新アクティビティが取得できたタイミングでは
+ // 必ず LiveData を更新するようにする。
+ // (同じ内容であっても UI 側に再通知されるだけなので副作用は小さい)
+
List userActivities = userActivitiesLiveData.getValue();
if (userActivities == null || userActivities.isEmpty()) {
- userActivitiesLiveData.postValue(List.of(latestActivity));
+ // 初回またはこれまでアクティビティが無い場合はそのまま反映
+ Log.d(ActivityViewModel.class.getSimpleName(), "updateFriendToActivitiesLiveData: initial set for user=" + userId
+ + ", activityId=" + latestActivity.getActivityId() + ", text=" + latestActivity.getText());
} else {
- if (userActivities.get(0).getActivityId().equals(latestActivity.getActivityId())) {
- return;
- }
-
- userActivitiesLiveData.postValue(List.of(latestActivity));
+ Activity previousLatest = userActivities.get(0);
+ Log.d(ActivityViewModel.class.getSimpleName(), "updateFriendToActivitiesLiveData: overwrite for user=" + userId
+ + " from activityId=" + previousLatest.getActivityId() + " to activityId=" + latestActivity.getActivityId());
}
+
+ // 最新アクティビティのみを保持するリストとして常に上書きする
+ userActivitiesLiveData.postValue(List.of(latestActivity));
}
/**
diff --git a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java
index 9911876..6079aa7 100644
--- a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java
+++ b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java
@@ -468,19 +468,20 @@
if (i < 6) {
i++;
}
+ // FriendIconView 自身が持つアクティビティ監視用 Observer を利用して
+ // 各フレンドの最新アクティビティが更新されたタイミングで
+ // 吹き出しコメントが自動的に変わるようにする
+ activitiesLiveData.observe(MainActivity.this, container.getActivitiesObserver());
- // TODO: CHANGE
+ // 念のため、MainActivity 側でも直接 FriendIconView のコメントを更新する
+ // (getActivitiesObserver() が正しく動作していれば二重更新になるが、副作用はない)
activitiesLiveData.observe(MainActivity.this, activities -> {
if (activities == null || activities.isEmpty()) return;
- Activity latest = activities.get(activities.size() - 1);
-
- // UIスレッドで安全に更新
- FriendIconView friendView = userViews.get(friendId);
- if (friendView != null) {
- friendView.setComment(latest.getText());
- Log.d("ActivityUpdate", friendId + " のコメントを更新: " + latest.getText());
- }
+ // ActivityViewModel 側では常に最新 1 件のみを保持しているため index 0 を参照する
+ Activity latest = activities.get(0);
+ container.setComment(latest.getText());
+ Log.d("ActivityUpdate", friendId + " のコメントを MainActivity から更新: " + latest.getText());
});
List sortedFriendUserIds = activityViewModel.getSortedFriendUserIds();