setVisibility(View.GONE)无效的解决方案

本文介绍了解决View动画结束后停留在结束位置的问题。通常这是由于设置了setFillAfter(true)导致的,可以通过调用clearAnimation()或者setFillAfter(false)来解决。

原因:一般出现这种情况都是为View设置了动画,并且调用了setFillAfter(true)方法设置动画结束后停留在结束位置。


解决方案:可以在setVisibility()之前调用clearAnimation()方法清除掉动画,或setFillAfter(false)(时间上该函数内部也调用了clearAnimation())。

快递接口返回状态3,但是他3下面还有301、本人签收,302、派件异常后签收,303、代签,304、投柜或站签收,3、签收这几种状态package com.weishitechsub.kdcxqwb.fragment.Adapter; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.weishitechsub.kdcxqwb.R; import com.weishitechsub.kdcxqwb.bean.ListBean; import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender; import com.weishitechsub.kdcxqwb.utils.ReminderManager; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> { private static final String TAG = "MyCourierAdapter"; private List<ListBean> mTrackList; private Context context; // 存储:用户手动开启了提醒的单号 private final Set<String> remindedEnabled = ConcurrentHashMap.newKeySet(); // 存储:每个单号最后一次被提醒到的状态(用于去重) private final Map<String, String> remindedStates = new ConcurrentHashMap<>(); private Handler mainHandler = new Handler(Looper.getMainLooper()); private static final String PREF_NAME = "courier_reminder"; int type; // 缓存当前列表数据,用于根据单号查找最新状态 private List<ListBean> currentList; public MyCourierAdapter(List<ListBean> list, Context context, int type) { super(R.layout.my_courier_adapter, list); this.context = context; this.type = type; ReminderManager.getInstance(context); // 初始化单例 } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) { String number = dataBean.getNum(); baseViewHolder.setText(R.id.tv_number, number); baseViewHolder.setText(R.id.tv_address, dataBean.getContext()); if (type == 1) { baseViewHolder.getView(R.id.tv_remind).setVisibility(View.GONE); baseViewHolder.getView(R.id.iv_remind).setVisibility(View.GONE); } else { baseViewHolder.getView(R.id.tv_remind).setVisibility(View.VISIBLE); baseViewHolder.getView(R.id.iv_remind).setVisibility(View.VISIBLE); } // 设置快递公司信息和图标 if (dataBean.getType() != null) { String trackName = getTrackName(dataBean.getType()); baseViewHolder.setText(R.id.tv_type, trackName); ImageView logo = baseViewHolder.getView(R.id.iv_logo); LinearLayout line = baseViewHolder.getView(R.id.line); setCompanyLogo(trackName, logo, line); } // ===== 获取状态文本 ===== String state = dataBean.getState(); String stateText = getStateText(state); baseViewHolder.setText(R.id.tv_state, stateText); ImageView ivRemind = baseViewHolder.getView(R.id.iv_remind); // === 统一处理所有状态分支(推荐:单一入口,避免遗漏)=== if ("3".equals(state) || "4".equals(state) || "6".equals(state)) { // 情况2:终止状态(签收/拒签/退回) ivRemind.setEnabled(false); ivRemind.setAlpha(0.5f); refreshRemindIcon(ivRemind, false); ivRemind.setOnClickListener(v -> { String tip = "3".equals(state) ? "该快递已签收,无需提醒。" : "4".equals(state) ? "该快递已拒签,订单结束。" : "该快递已被退回。"; Toast.makeText(context, tip, Toast.LENGTH_SHORT).show(); }); // 自动关闭提醒(如果之前开启了) remindedEnabled.remove(number); remindedStates.put(number, state); } else { // 情况3:正常流转状态 → 允许开启提醒 // ===== 状态变更检测 & 发送通知 ===== if (remindedEnabled.contains(number)) { String oldState = remindedStates.get(number); if (oldState != null && !state.equals(oldState)) { String company = getTrackName(dataBean.getType()); sendStatusNotification(number, company, getStateText(state), getNotifyContent(state)); } remindedStates.put(number, state); } // 刷新图标 boolean isCurrentlyReminded = ReminderManager.getInstance(context).isReminded(number); refreshRemindIcon(ivRemind, isCurrentlyReminded); // 设置点击事件 ivRemind.setEnabled(true); ivRemind.setAlpha(1.0f); ivRemind.setOnClickListener(v -> { boolean nowEnabled = ReminderManager.getInstance(context).isReminded(number); if (nowEnabled) { ReminderManager.getInstance(context).disableReminder(number); Toast.makeText(context, "已关闭提醒: " + number, Toast.LENGTH_SHORT).show(); Log.d(TAG, "【状态异常】state=" + state + ", stateText=" + stateText); // 调试用 Log.d(TAG, "【节点】state=" + context ); // 调试用 } else { enableReminderWithPermissionCheck(dataBean); } refreshRemindIcon(ivRemind, !nowEnabled); }); } // 可选:缓存当前列表用于外部查询 if (currentList == null) { currentList = new ArrayList<>(); } } // 检查权限后开启提醒,并发送“当前状态”的通知 private void enableReminderWithPermissionCheck(ListBean dataBean) { String number = dataBean.getNum(); String state = dataBean.getState(); String type = dataBean.getType(); // 权限检查... if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { showNotificationPermissionDialog(); return; } } // 启用提醒(自动保存到 SP) ReminderManager.getInstance(context).enableReminder(number); Toast.makeText(context, "已开启提醒: " + number, Toast.LENGTH_SHORT).show(); // 发送欢迎通知 String companyName = getTrackName(type); sendStatusNotification(number, companyName, getStateText(state), getNotifyContent(state)); } // 刷新提醒按钮图标 private void refreshRemindIcon(ImageView ivRemind, boolean isEnabled) { if (isEnabled) { ivRemind.setImageResource(R.mipmap.button_on); // 🔔 } else { ivRemind.setImageResource(R.mipmap.button_off); // 🔕 } } // 获取状态中文文本 private String getStateText(String state) { switch (state) { case "0": return "在途"; case "5": return "派件"; case "3": return "签收"; case "6": return "退回"; case "4": return "退签"; case "1": return "揽收"; case "7": return "转投"; case "2": return "疑难"; case "8": return "清关"; case "10": return "待清关"; case "11": return "清关中"; case "12": return "已清关"; case "13": return "清关异常"; default: return null; } } // 获取对应状态的通知内容 private String getNotifyContent(String state) { switch (state) { case "0": return "您的快递已在运输途中,正在路上~"; case "5": return "快递员正在为您派送,请注意查收!"; case "3": return "您的快递已签收,感谢使用!"; case "6": return "很遗憾,您的快递因故被退回。"; case "4": return "您已拒签该快递,订单已完成。"; default: return "快递因地址问题已转投其他网点。"; } } // 发送状态变更通知 private void sendStatusNotification(String number, String company, String titleSuffix, String content) { PackageNotificationSender sender = new PackageNotificationSender(context); int id = ("status_" + number).hashCode() & Integer.MAX_VALUE; id = (id % 1_000_000) + 2000; // 控制 ID 范围,避免冲突 sender.sendCustomNotification(id, "📌 快递" + titleSuffix, content, number, company); } // 根据 type 查找快递公司名称 private String getTrackName(String type) { if (mTrackList != null) { for (ListBean item : mTrackList) { if (item.getNum() != null && type != null && TextUtils.equals(item.getNum(), type)) { return item.getCom(); } } } return ""; } // 设置外部数据源 public void setTrackList(List<ListBean> list) { this.mTrackList = list; } // 缓存当前列表(供开启提醒时查询状态) @Override public void setNewInstance(List<ListBean> list) { super.setNewInstance(list); this.currentList = list; } // 可选:暴露方法供外部查询某单号是否开启提醒 public boolean isReminderEnabled(String number) { return remindedEnabled.contains(number); } /** * 根据快递公司名称设置对应的 Logo 图标 */ private void setCompanyLogo(String name, ImageView logo, LinearLayout line) { if (name == null || name.isEmpty()) { logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); return; } switch (name) { case "邮政快递包裹": logo.setImageResource(R.mipmap.img_yz_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "京东物流": logo.setImageResource(R.mipmap.img_jd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "圆通快递": logo.setImageResource(R.mipmap.img_yt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "中通快递": logo.setImageResource(R.mipmap.img_zt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "顺丰速运": logo.setImageResource(R.mipmap.img_sf_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "韵达快递": logo.setImageResource(R.mipmap.img_yd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "申通快递": logo.setImageResource(R.mipmap.img_st_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "EMS": logo.setImageResource(R.mipmap.img_ems_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; default: logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); break; } } public void loadSavedStates() { // 如果 ReminderManager 已经负责加载,则不需要此方法 // 或者你可以让它触发一次同步 ReminderManager manager = ReminderManager.getInstance(context); // manager.loadFromSP(); // 如果不是自动加载,手动调用 } // MyCourierAdapter.java 中新增 public List<ListBean> getRemindedItems() { List<ListBean> result = new ArrayList<>(); if (currentList == null) return result; Set<String> remindedNumbers = ReminderManager.getInstance(context).getRemindedNumbers(); for (ListBean bean : currentList) { if (remindedNumbers.contains(bean.getNum())) { result.add(bean); } } return result; } private void showNotificationPermissionDialog() { if (context == null) return; new AlertDialog.Builder(context) .setTitle("需要通知权限") .setMessage("请允许本应用发送快递状态提醒通知。\n\n进入【设置】→【通知】中开启权限。") .setPositiveButton("去开启", (dialog, which) -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 防止在非 Activity 上下文中启动失败 context.startActivity(intent); }) .setNegativeButton("取消", (dialog, which) -> { Toast.makeText(context, "未授予通知权限,无法开启提醒", Toast.LENGTH_SHORT).show(); }) .create() .show(); } } 我在这个适配器里该怎么写
最新发布
11-29
package com.weishitechsub.kdcxqwb.fragment.Adapter; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.weishitechsub.kdcxqwb.R; import com.weishitechsub.kdcxqwb.bean.ListBean; import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender; import com.weishitechsub.kdcxqwb.utils.ReminderManager; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> { private static final String TAG = "MyCourierAdapter"; private List<ListBean> mTrackList; private Context context; // 存储:用户手动开启了提醒的单号 private final Set<String> remindedEnabled = ConcurrentHashMap.newKeySet(); // 存储:每个单号最后一次被提醒到的状态(用于去重) private final Map<String, String> remindedStates = new ConcurrentHashMap<>(); private Handler mainHandler = new Handler(Looper.getMainLooper()); private static final String PREF_NAME = "courier_reminder"; int type; // 缓存当前列表数据,用于根据单号查找最新状态 private List<ListBean> currentList; public MyCourierAdapter(List<ListBean> list, Context context,int type) { super(R.layout.my_courier_adapter, list); this.context = context; this.type = type; ReminderManager.getInstance(context); // 初始化单例 } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) { String number = dataBean.getNum(); baseViewHolder.setText(R.id.tv_number, number); baseViewHolder.setText(R.id.tv_address, dataBean.getContext()); if (type == 1) { baseViewHolder.getView(R.id.tv_remind).setVisibility(View.GONE); baseViewHolder.getView(R.id.iv_remind).setVisibility(View.GONE); }else { baseViewHolder.getView(R.id.tv_remind).setVisibility(View.VISIBLE); baseViewHolder.getView(R.id.iv_remind).setVisibility(View.VISIBLE); } // 设置快递公司信息和图标 if (dataBean.getType() != null) { String trackName = getTrackName(dataBean.getType()); baseViewHolder.setText(R.id.tv_type, trackName); ImageView logo = baseViewHolder.getView(R.id.iv_logo); LinearLayout line = baseViewHolder.getView(R.id.line); setCompanyLogo(trackName, logo, line); } // ===== 核心逻辑:状态变更检测 + 条件性通知 ===== String state = dataBean.getState(); if (state != null) { baseViewHolder.setText(R.id.tv_state, getStateText(state)); // === 如果是终止状态,自动关闭提醒并记录最终状态 === if ("3".equals(state) || "4".equals(state) || "6".equals(state)) { remindedEnabled.remove(number); remindedStates.put(number, state); } // 只有在【用户开启了提醒】的前提下才进行通知 if (remindedEnabled.contains(number)) { String oldState = remindedStates.get(number); // 状态变化时发送通知(排除首次) if (oldState != null && !state.equals(oldState)) { String company = getTrackName(dataBean.getType()); sendStatusNotification(number, company, getStateText(state), getNotifyContent(state)); } // 更新最后提醒状态 remindedStates.put(number, state); } } ImageView ivRemind = baseViewHolder.getView(R.id.iv_remind); // 每次绑定时刷新图标(根据最新状态) boolean isCurrentlyReminded = ReminderManager.getInstance(context).isReminded(number); refreshRemindIcon(ivRemind, isCurrentlyReminded); // 终止状态不可操作 if ("3".equals(state) || "4".equals(state) || "6".equals(state)) { ivRemind.setOnClickListener(v -> { String tip = "3".equals(state) ? "该快递已签收,无需提醒。" : "4".equals(state) ? "该快递已拒签,订单结束。" : "该快递已被退回。"; Toast.makeText(context, tip, Toast.LENGTH_SHORT).show(); }); ivRemind.setEnabled(false); ivRemind.setAlpha(0.5f); } else { ivRemind.setEnabled(true); ivRemind.setAlpha(1.0f); // 不要用外部变量 isReminded!每次点击都查一遍 ivRemind.setOnClickListener(v -> { boolean nowEnabled = ReminderManager.getInstance(context).isReminded(number); if (nowEnabled) { // 当前已开启 → 执行关闭 ReminderManager.getInstance(context).disableReminder(number); Toast.makeText(context, "已关闭提醒: " + number, Toast.LENGTH_SHORT).show(); } else { // 当前已关闭 → 尝试开启(权限检查 + 提醒) enableReminderWithPermissionCheck(dataBean); } // 强制刷新图标 refreshRemindIcon(ivRemind, !nowEnabled); // 可选:通知数据变化,防止列表错乱 // notifyItemChanged(getDataSource().indexOf(dataBean)); }); } } // 检查权限后开启提醒,并发送“当前状态”的通知 private void enableReminderWithPermissionCheck(ListBean dataBean) { String number = dataBean.getNum(); String state = dataBean.getState(); String type = dataBean.getType(); // 权限检查... if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { showNotificationPermissionDialog(); return; } } // 启用提醒(自动保存到 SP) ReminderManager.getInstance(context).enableReminder(number); Toast.makeText(context, "已开启提醒: " + number, Toast.LENGTH_SHORT).show(); // 发送欢迎通知 String companyName = getTrackName(type); sendStatusNotification(number, companyName, getStateText(state), getNotifyContent(state)); } // 刷新提醒按钮图标 private void refreshRemindIcon(ImageView ivRemind, boolean isEnabled) { if (isEnabled) { ivRemind.setImageResource(R.mipmap.button_on); // 🔔 } else { ivRemind.setImageResource(R.mipmap.button_off); // 🔕 } } // 获取状态中文文本 private String getStateText(String state) { switch (state) { case "0": return "在途"; case "5": return "派件"; case "3": return "签收"; case "6": return "退回"; case "4": return "退签"; case "1": return "揽收"; case "7": return "转投"; case "2": return "疑难"; case "8": return "清关"; case "10": return "待清关"; case "11": return "清关中"; case "12": return "已清关"; case "13": return "清关异常"; default: return ""; } } // 获取对应状态的通知内容 private String getNotifyContent(String state) { switch (state) { case "0": return "您的快递已在运输途中,正在路上~"; case "5": return "快递员正在为您派送,请注意查收!"; case "3": return "您的快递已签收,感谢使用!"; case "6": return "很遗憾,您的快递因故被退回。"; case "4": return "您已拒签该快递,订单已完成。"; default: return "快递因地址问题已转投其他网点。"; } } // 发送状态变更通知 private void sendStatusNotification(String number, String company, String titleSuffix, String content) { PackageNotificationSender sender = new PackageNotificationSender(context); int id = ("status_" + number).hashCode() & Integer.MAX_VALUE; id = (id % 1_000_000) + 2000; // 控制 ID 范围,避免冲突 sender.sendCustomNotification(id, "📌 快递" + titleSuffix, content, number, company); } // 根据 type 查找快递公司名称 private String getTrackName(String type) { if (mTrackList != null) { for (ListBean item : mTrackList) { if (item.getNum() != null && type != null && TextUtils.equals(item.getNum(), type)) { return item.getCom(); } } } return ""; } // 设置外部数据源 public void setTrackList(List<ListBean> list) { this.mTrackList = list; } // 缓存当前列表(供开启提醒时查询状态) @Override public void setNewInstance(List<ListBean> list) { super.setNewInstance(list); this.currentList = list; } // 可选:暴露方法供外部查询某单号是否开启提醒 public boolean isReminderEnabled(String number) { return remindedEnabled.contains(number); } /** * 根据快递公司名称设置对应的 Logo 图标 */ private void setCompanyLogo(String name, ImageView logo, LinearLayout line) { if (name == null || name.isEmpty()) { logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); return; } switch (name) { case "邮政快递包裹": logo.setImageResource(R.mipmap.img_yz_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "京东物流": logo.setImageResource(R.mipmap.img_jd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "圆通快递": logo.setImageResource(R.mipmap.img_yt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "中通快递": logo.setImageResource(R.mipmap.img_zt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "顺丰速运": logo.setImageResource(R.mipmap.img_sf_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "韵达快递": logo.setImageResource(R.mipmap.img_yd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "申通快递": logo.setImageResource(R.mipmap.img_st_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "EMS": logo.setImageResource(R.mipmap.img_ems_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; default: logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); break; } } public void loadSavedStates() { // 如果 ReminderManager 已经负责加载,则不需要此方法 // 或者你可以让它触发一次同步 ReminderManager manager = ReminderManager.getInstance(context); // manager.loadFromSP(); // 如果不是自动加载,手动调用 } // MyCourierAdapter.java 中新增 public List<ListBean> getRemindedItems() { List<ListBean> result = new ArrayList<>(); if (currentList == null) return result; Set<String> remindedNumbers = ReminderManager.getInstance(context).getRemindedNumbers(); for (ListBean bean : currentList) { if (remindedNumbers.contains(bean.getNum())) { result.add(bean); } } return result; } private void showNotificationPermissionDialog() { if (context == null) return; new AlertDialog.Builder(context) .setTitle("需要通知权限") .setMessage("请允许本应用发送快递状态提醒通知。\n\n进入【设置】→【通知】中开启权限。") .setPositiveButton("去开启", (dialog, which) -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 防止在非 Activity 上下文中启动失败 context.startActivity(intent); }) .setNegativeButton("取消", (dialog, which) -> { Toast.makeText(context, "未授予通知权限,无法开启提醒", Toast.LENGTH_SHORT).show(); }) .create() .show(); } } private String getStateText(String state) { switch (state) { case "0": return "在途"; case "5": return "派件"; case "3": return "签收"; case "6": return "退回"; case "4": return "退签"; case "1": return "揽收"; case "7": return "转投"; case "2": return "疑难"; case "8": return "清关"; case "10": return "待清关"; case "11": return "清关中"; case "12": return "已清关"; case "13": return "清关异常"; default: return ""; } }这个返回空也不让他点击通知按钮
11-29
package com.weishitechsub.kdcxqwb.fragment.Adapter; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.weishitechsub.kdcxqwb.R; import com.weishitechsub.kdcxqwb.bean.ListBean; import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender; import com.weishitechsub.kdcxqwb.utils.ReminderManager; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> { private static final String TAG = "MyCourierAdapter"; private List<ListBean> mTrackList; private Context context; // 存储:用户手动开启了提醒的单号 private final Set<String> remindedEnabled = ConcurrentHashMap.newKeySet(); // 存储:每个单号最后一次被提醒到的状态(用于去重) private final Map<String, String> remindedStates = new ConcurrentHashMap<>(); private Handler mainHandler = new Handler(Looper.getMainLooper()); private static final String PREF_NAME = "courier_reminder"; int type; // 缓存当前列表数据,用于根据单号查找最新状态 private List<ListBean> currentList; public MyCourierAdapter(List<ListBean> list, Context context, int type) { super(R.layout.my_courier_adapter, list); this.context = context; this.type = type; ReminderManager.getInstance(context); // 初始化单例 } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) { String number = dataBean.getNum(); baseViewHolder.setText(R.id.tv_number, number); baseViewHolder.setText(R.id.tv_address, dataBean.getContext()); if (type == 1) { baseViewHolder.getView(R.id.tv_remind).setVisibility(View.GONE); baseViewHolder.getView(R.id.iv_remind).setVisibility(View.GONE); } else { baseViewHolder.getView(R.id.tv_remind).setVisibility(View.VISIBLE); baseViewHolder.getView(R.id.iv_remind).setVisibility(View.VISIBLE); } // 设置快递公司信息和图标 if (dataBean.getType() != null) { String trackName = getTrackName(dataBean.getType()); baseViewHolder.setText(R.id.tv_type, trackName); ImageView logo = baseViewHolder.getView(R.id.iv_logo); LinearLayout line = baseViewHolder.getView(R.id.line); setCompanyLogo(trackName, logo, line); } // ===== 获取状态文本 ===== String state = dataBean.getState(); String stateText = getStateText(state); baseViewHolder.setText(R.id.tv_state, stateText); ImageView ivRemind = baseViewHolder.getView(R.id.iv_remind); // === 统一处理所有状态分支(推荐:单一入口,避免遗漏)=== if (state == null || TextUtils.isEmpty(stateText)) { // 情况1:状态为空或无效 ivRemind.setEnabled(false); ivRemind.setAlpha(0.4f); refreshRemindIcon(ivRemind, false); ivRemind.setOnClickListener(v -> { Toast.makeText(context, "该快递状态异常,暂不支持提醒功能", Toast.LENGTH_SHORT).show(); }); } else if ("3".equals(state) || "4".equals(state) || "6".equals(state)) { // 情况2:终止状态(签收/拒签/退回) ivRemind.setEnabled(false); ivRemind.setAlpha(0.5f); refreshRemindIcon(ivRemind, false); ivRemind.setOnClickListener(v -> { String tip = "3".equals(state) ? "该快递已签收,无需提醒。" : "4".equals(state) ? "该快递已拒签,订单结束。" : "该快递已被退回。"; Toast.makeText(context, tip, Toast.LENGTH_SHORT).show(); }); // 自动关闭提醒(如果之前开启了) remindedEnabled.remove(number); remindedStates.put(number, state); } else { // 情况3:正常流转状态 → 允许开启提醒 // ===== 状态变更检测 & 发送通知 ===== if (remindedEnabled.contains(number)) { String oldState = remindedStates.get(number); if (oldState != null && !state.equals(oldState)) { String company = getTrackName(dataBean.getType()); sendStatusNotification(number, company, getStateText(state), getNotifyContent(state)); } remindedStates.put(number, state); } // 刷新图标 boolean isCurrentlyReminded = ReminderManager.getInstance(context).isReminded(number); refreshRemindIcon(ivRemind, isCurrentlyReminded); // 设置点击事件 ivRemind.setEnabled(true); ivRemind.setAlpha(1.0f); ivRemind.setOnClickListener(v -> { boolean nowEnabled = ReminderManager.getInstance(context).isReminded(number); if (nowEnabled) { ReminderManager.getInstance(context).disableReminder(number); Toast.makeText(context, "已关闭提醒: " + number, Toast.LENGTH_SHORT).show(); } else { enableReminderWithPermissionCheck(dataBean); } refreshRemindIcon(ivRemind, !nowEnabled); }); } // 可选:缓存当前列表用于外部查询 if (currentList == null) { currentList = new ArrayList<>(); } } // 检查权限后开启提醒,并发送“当前状态”的通知 private void enableReminderWithPermissionCheck(ListBean dataBean) { String number = dataBean.getNum(); String state = dataBean.getState(); String type = dataBean.getType(); // 权限检查... if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { showNotificationPermissionDialog(); return; } } // 启用提醒(自动保存到 SP) ReminderManager.getInstance(context).enableReminder(number); Toast.makeText(context, "已开启提醒: " + number, Toast.LENGTH_SHORT).show(); // 发送欢迎通知 String companyName = getTrackName(type); sendStatusNotification(number, companyName, getStateText(state), getNotifyContent(state)); } // 刷新提醒按钮图标 private void refreshRemindIcon(ImageView ivRemind, boolean isEnabled) { if (isEnabled) { ivRemind.setImageResource(R.mipmap.button_on); // 🔔 } else { ivRemind.setImageResource(R.mipmap.button_off); // 🔕 } } // 获取状态中文文本 private String getStateText(String state) { switch (state) { case "0": return "在途"; case "5": return "派件"; case "3": return "签收"; case "6": return "退回"; case "4": return "退签"; case "1": return "揽收"; case "7": return "转投"; case "2": return "疑难"; case "8": return "清关"; case "10": return "待清关"; case "11": return "清关中"; case "12": return "已清关"; case "13": return "清关异常"; default: return null; } } // 获取对应状态的通知内容 private String getNotifyContent(String state) { switch (state) { case "0": return "您的快递已在运输途中,正在路上~"; case "5": return "快递员正在为您派送,请注意查收!"; case "3": return "您的快递已签收,感谢使用!"; case "6": return "很遗憾,您的快递因故被退回。"; case "4": return "您已拒签该快递,订单已完成。"; default: return "快递因地址问题已转投其他网点。"; } } // 发送状态变更通知 private void sendStatusNotification(String number, String company, String titleSuffix, String content) { PackageNotificationSender sender = new PackageNotificationSender(context); int id = ("status_" + number).hashCode() & Integer.MAX_VALUE; id = (id % 1_000_000) + 2000; // 控制 ID 范围,避免冲突 sender.sendCustomNotification(id, "📌 快递" + titleSuffix, content, number, company); } // 根据 type 查找快递公司名称 private String getTrackName(String type) { if (mTrackList != null) { for (ListBean item : mTrackList) { if (item.getNum() != null && type != null && TextUtils.equals(item.getNum(), type)) { return item.getCom(); } } } return ""; } // 设置外部数据源 public void setTrackList(List<ListBean> list) { this.mTrackList = list; } // 缓存当前列表(供开启提醒时查询状态) @Override public void setNewInstance(List<ListBean> list) { super.setNewInstance(list); this.currentList = list; } // 可选:暴露方法供外部查询某单号是否开启提醒 public boolean isReminderEnabled(String number) { return remindedEnabled.contains(number); } /** * 根据快递公司名称设置对应的 Logo 图标 */ private void setCompanyLogo(String name, ImageView logo, LinearLayout line) { if (name == null || name.isEmpty()) { logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); return; } switch (name) { case "邮政快递包裹": logo.setImageResource(R.mipmap.img_yz_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "京东物流": logo.setImageResource(R.mipmap.img_jd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "圆通快递": logo.setImageResource(R.mipmap.img_yt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "中通快递": logo.setImageResource(R.mipmap.img_zt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "顺丰速运": logo.setImageResource(R.mipmap.img_sf_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "韵达快递": logo.setImageResource(R.mipmap.img_yd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "申通快递": logo.setImageResource(R.mipmap.img_st_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "EMS": logo.setImageResource(R.mipmap.img_ems_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; default: logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); break; } } public void loadSavedStates() { // 如果 ReminderManager 已经负责加载,则不需要此方法 // 或者你可以让它触发一次同步 ReminderManager manager = ReminderManager.getInstance(context); // manager.loadFromSP(); // 如果不是自动加载,手动调用 } // MyCourierAdapter.java 中新增 public List<ListBean> getRemindedItems() { List<ListBean> result = new ArrayList<>(); if (currentList == null) return result; Set<String> remindedNumbers = ReminderManager.getInstance(context).getRemindedNumbers(); for (ListBean bean : currentList) { if (remindedNumbers.contains(bean.getNum())) { result.add(bean); } } return result; } private void showNotificationPermissionDialog() { if (context == null) return; new AlertDialog.Builder(context) .setTitle("需要通知权限") .setMessage("请允许本应用发送快递状态提醒通知。\n\n进入【设置】→【通知】中开启权限。") .setPositiveButton("去开启", (dialog, which) -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 防止在非 Activity 上下文中启动失败 context.startActivity(intent); }) .setNegativeButton("取消", (dialog, which) -> { Toast.makeText(context, "未授予通知权限,无法开启提醒", Toast.LENGTH_SHORT).show(); }) .create() .show(); } } 这个判断 if (state == null || TextUtils.isEmpty(stateText)) { // 情况1:状态为空或无效 ivRemind.setEnabled(false); ivRemind.setAlpha(0.4f); refreshRemindIcon(ivRemind, false); ivRemind.setOnClickListener(v -> { Toast.makeText(context, "该快递状态异常,暂不支持提醒功能", Toast.LENGTH_SHORT).show(); }); } 还是不提醒
11-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值