zhibo/android-app/app/src/main/java/com/example/livestreaming/NotificationsAdapter.java
2025-12-23 18:09:56 +08:00

173 lines
6.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.example.livestreaming;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.example.livestreaming.databinding.ItemNotificationBinding;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class NotificationsAdapter extends ListAdapter<NotificationItem, NotificationsAdapter.VH> {
public interface OnNotificationClickListener {
void onNotificationClick(NotificationItem item);
}
private final OnNotificationClickListener onNotificationClickListener;
public NotificationsAdapter(OnNotificationClickListener onNotificationClickListener) {
super(DIFF);
this.onNotificationClickListener = onNotificationClickListener;
}
@NonNull
@Override
public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemNotificationBinding binding = ItemNotificationBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new VH(binding, onNotificationClickListener);
}
@Override
public void onBindViewHolder(@NonNull VH holder, int position) {
holder.bind(getItem(position));
}
static class VH extends RecyclerView.ViewHolder {
private final ItemNotificationBinding binding;
private final OnNotificationClickListener onNotificationClickListener;
private final SimpleDateFormat timeFormat = new SimpleDateFormat("MM-dd HH:mm", Locale.getDefault());
private final SimpleDateFormat todayFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());
VH(ItemNotificationBinding binding, OnNotificationClickListener onNotificationClickListener) {
super(binding.getRoot());
this.binding = binding;
this.onNotificationClickListener = onNotificationClickListener;
}
void bind(NotificationItem item) {
if (item == null) return;
// 设置标题和内容
binding.title.setText(item.getTitle() != null ? item.getTitle() : "");
binding.content.setText(item.getContent() != null ? item.getContent() : "");
// 设置时间
Date timestamp = item.getTimestamp();
if (timestamp != null) {
String timeText = formatTime(timestamp);
binding.timeText.setText(timeText);
} else {
binding.timeText.setText("");
}
// 设置未读标记
if (!item.isRead()) {
binding.unreadDot.setVisibility(View.VISIBLE);
} else {
binding.unreadDot.setVisibility(View.GONE);
}
// 加载头像
loadAvatar(item);
// 设置点击事件
binding.getRoot().setOnClickListener(v -> {
if (onNotificationClickListener != null) {
onNotificationClickListener.onNotificationClick(item);
}
});
}
private String formatTime(Date date) {
if (date == null) return "";
Date now = new Date();
long diff = now.getTime() - date.getTime();
// 如果是今天,只显示时间
if (diff < 24 * 60 * 60 * 1000 && isToday(date, now)) {
return todayFormat.format(date);
}
// 否则显示日期和时间
return timeFormat.format(date);
}
private boolean isToday(Date date, Date now) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
return dateFormat.format(date).equals(dateFormat.format(now));
}
private void loadAvatar(NotificationItem item) {
// TODO: 接入后端接口 - 从后端获取通知发送者的头像URL
// 接口路径: GET /api/user/profile/{senderId}
// 请求参数: senderId (路径参数从NotificationItem中获取)
// 返回数据格式: ApiResponse<{avatarUrl: string}>
// 如果NotificationItem包含senderId则调用此接口获取头像否则使用默认图标
if (binding.avatar == null) return;
String avatarUrl = item.getAvatarUrl();
if (!TextUtils.isEmpty(avatarUrl)) {
Glide.with(binding.avatar)
.load(avatarUrl)
.circleCrop()
.placeholder(R.drawable.ic_account_circle_24)
.error(R.drawable.ic_account_circle_24)
.into(binding.avatar);
} else {
// 根据通知类型设置默认图标
int iconRes = getIconForType(item.getType());
Glide.with(binding.avatar)
.load(iconRes)
.circleCrop()
.into(binding.avatar);
}
}
private int getIconForType(NotificationItem.Type type) {
if (type == null) return R.drawable.ic_notifications_24;
switch (type) {
case SYSTEM:
return R.drawable.ic_notifications_24;
case INTERACTION:
return R.drawable.ic_chat_24;
case FOLLOW:
return R.drawable.ic_people_24;
case MESSAGE:
return R.drawable.ic_chat_24;
case LIVE:
return R.drawable.ic_voice_24;
default:
return R.drawable.ic_notifications_24;
}
}
}
private static final DiffUtil.ItemCallback<NotificationItem> DIFF = new DiffUtil.ItemCallback<NotificationItem>() {
@Override
public boolean areItemsTheSame(@NonNull NotificationItem oldItem, @NonNull NotificationItem newItem) {
String o = oldItem.getId();
String n = newItem.getId();
return o != null && o.equals(n);
}
@Override
public boolean areContentsTheSame(@NonNull NotificationItem oldItem, @NonNull NotificationItem newItem) {
return oldItem.equals(newItem) && oldItem.isRead() == newItem.isRead();
}
};
}