feat(mmp): 领取进度/过期状态,并展示红包与领取人ID
状态优先显示已全部领取或已领取N/M,未领完才附加已过期;列表与最高最低补全 activityId、receiverId。
This commit is contained in:
@@ -7,6 +7,7 @@ import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
@@ -157,42 +158,52 @@ public class MmpClaimActivity extends MiracleGardenActivity<ActivityMmpClaimBind
|
||||
holder.setText(R.id.tv_sum, formatMoney(packet.sumClaimed > 0
|
||||
? packet.sumClaimed : parseDouble(packet.total)));
|
||||
|
||||
TextView idView = holder.getView(R.id.tv_id);
|
||||
if (!TextUtils.isEmpty(packet.packetId)) {
|
||||
idView.setVisibility(View.VISIBLE);
|
||||
idView.setText("ID " + packet.packetId);
|
||||
} else {
|
||||
idView.setVisibility(View.GONE);
|
||||
idView.setText("");
|
||||
}
|
||||
|
||||
android.widget.TextView status = holder.getView(R.id.tv_status);
|
||||
if (packet.finished) {
|
||||
status.setText("已领完");
|
||||
status.setText(packet.statusLabel());
|
||||
if (packet.isFullyClaimed()) {
|
||||
status.setTextColor(Color.parseColor("#047857"));
|
||||
status.setBackgroundColor(Color.parseColor("#ECFDF5"));
|
||||
} else if (packet.isExpired()) {
|
||||
status.setTextColor(Color.parseColor("#6B7280"));
|
||||
status.setBackgroundColor(Color.parseColor("#F3F4F6"));
|
||||
} else {
|
||||
status.setText("领取中");
|
||||
status.setTextColor(Color.parseColor("#B45309"));
|
||||
status.setBackgroundColor(Color.parseColor("#FFFBEB"));
|
||||
}
|
||||
|
||||
String meta = packet.claimantCount + " 人";
|
||||
String meta;
|
||||
if (packet.effectiveTotalCount() > 0) {
|
||||
meta = packet.effectiveClaimedCount() + "/" + packet.effectiveTotalCount() + " 人";
|
||||
} else {
|
||||
meta = packet.claimantCount + " 人";
|
||||
}
|
||||
if (packet.issuedAt != null && !packet.issuedAt.isEmpty()) {
|
||||
meta += " · 发放 " + packet.issuedAt;
|
||||
}
|
||||
if (packet.expiresAt != null && !packet.expiresAt.isEmpty()) {
|
||||
meta += " · 到期 " + packet.expiresAt;
|
||||
}
|
||||
holder.setText(R.id.tv_meta, meta);
|
||||
|
||||
String hi = packet.finished ? "最佳" : "最高";
|
||||
String lo = packet.finished ? "最差" : "最低";
|
||||
com.miraclegarden.smsmessage.mmp.MmpClaim best = packet.bestClaim();
|
||||
com.miraclegarden.smsmessage.mmp.MmpClaim worst = packet.worstClaim();
|
||||
if (best != null) {
|
||||
String amt = best.amountText != null ? best.amountText : formatMoney(best.amount);
|
||||
String nick = best.nickname != null ? best.nickname : "?";
|
||||
holder.setText(R.id.tv_best, hi + " " + nick + " " + amt);
|
||||
} else {
|
||||
holder.setText(R.id.tv_best, hi + " -");
|
||||
}
|
||||
holder.setText(R.id.tv_best, formatHiLoLine(hi, best));
|
||||
if (worst != null && packet.claimantCount > 1) {
|
||||
String amt = worst.amountText != null ? worst.amountText : formatMoney(worst.amount);
|
||||
String nick = worst.nickname != null ? worst.nickname : "?";
|
||||
holder.setText(R.id.tv_worst, lo + " " + nick + " " + amt);
|
||||
holder.setText(R.id.tv_worst, formatHiLoLine(lo, worst));
|
||||
} else {
|
||||
holder.setText(R.id.tv_worst, lo + " -");
|
||||
}
|
||||
holder.setText(R.id.tv_id, packet.shortId());
|
||||
holder.itemView.setOnClickListener(v -> openDetail(packet.packetId));
|
||||
}
|
||||
};
|
||||
@@ -538,6 +549,19 @@ public class MmpClaimActivity extends MiracleGardenActivity<ActivityMmpClaimBind
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private static String formatHiLoLine(String prefix,
|
||||
com.miraclegarden.smsmessage.mmp.MmpClaim claim) {
|
||||
if (claim == null) {
|
||||
return prefix + " -";
|
||||
}
|
||||
String nick = claim.nickname != null ? claim.nickname : "?";
|
||||
String amt = claim.amountText != null ? claim.amountText : formatMoney(claim.amount);
|
||||
if (!TextUtils.isEmpty(claim.userId)) {
|
||||
return prefix + " " + nick + " " + amt + "\nID " + claim.userId;
|
||||
}
|
||||
return prefix + " " + nick + " " + amt;
|
||||
}
|
||||
|
||||
private void confirmClear() {
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle("清空红包台")
|
||||
|
||||
@@ -156,17 +156,16 @@ public class MmpDetailActivity extends MiracleGardenActivity<ActivityMmpDetailBi
|
||||
}
|
||||
sub.append("发放 ").append(packet.issuedAt);
|
||||
}
|
||||
if (packet.finished) {
|
||||
if (!TextUtils.isEmpty(packet.expiresAt)) {
|
||||
if (sub.length() > 0) {
|
||||
sub.append(" · ");
|
||||
}
|
||||
sub.append("已领完");
|
||||
} else {
|
||||
if (sub.length() > 0) {
|
||||
sub.append(" · ");
|
||||
}
|
||||
sub.append("领取中");
|
||||
sub.append("到期 ").append(packet.expiresAt);
|
||||
}
|
||||
if (sub.length() > 0) {
|
||||
sub.append(" · ");
|
||||
}
|
||||
sub.append(packet.statusLabel());
|
||||
binding.tvSub.setText(sub.toString());
|
||||
|
||||
binding.tvStatPeople.setText(String.valueOf(packet.claimantCount));
|
||||
@@ -181,7 +180,7 @@ public class MmpDetailActivity extends MiracleGardenActivity<ActivityMmpDetailBi
|
||||
MmpClaim worst = packet.worstClaim();
|
||||
if (best != null) {
|
||||
bestAmount = best.amount;
|
||||
binding.tvBestName.setText(best.nickname != null ? best.nickname : "?");
|
||||
binding.tvBestName.setText(formatClaimName(best));
|
||||
binding.tvBestAmt.setText(best.amountText != null ? best.amountText
|
||||
: String.format(Locale.US, "%.2f", best.amount));
|
||||
} else {
|
||||
@@ -191,7 +190,7 @@ public class MmpDetailActivity extends MiracleGardenActivity<ActivityMmpDetailBi
|
||||
}
|
||||
if (worst != null && packet.claimantCount > 1) {
|
||||
worstAmount = worst.amount;
|
||||
binding.tvWorstName.setText(worst.nickname != null ? worst.nickname : "?");
|
||||
binding.tvWorstName.setText(formatClaimName(worst));
|
||||
binding.tvWorstAmt.setText(worst.amountText != null ? worst.amountText
|
||||
: String.format(Locale.US, "%.2f", worst.amount));
|
||||
} else {
|
||||
@@ -213,6 +212,17 @@ public class MmpDetailActivity extends MiracleGardenActivity<ActivityMmpDetailBi
|
||||
handler.postDelayed(refreshRunnable, 2000);
|
||||
}
|
||||
|
||||
private static String formatClaimName(MmpClaim claim) {
|
||||
if (claim == null) {
|
||||
return "-";
|
||||
}
|
||||
String nick = claim.nickname != null ? claim.nickname : "?";
|
||||
if (!TextUtils.isEmpty(claim.userId)) {
|
||||
return nick + "\nID " + claim.userId;
|
||||
}
|
||||
return nick;
|
||||
}
|
||||
|
||||
private static double parseDouble(String s) {
|
||||
try {
|
||||
return s == null || s.isEmpty() ? 0 : Double.parseDouble(s);
|
||||
|
||||
@@ -5,8 +5,8 @@ package com.miraclegarden.smsmessage.mmp;
|
||||
*/
|
||||
public final class MmpModuleInfo {
|
||||
public static final String XPOSED_PACKAGE = "com.miraclegarden.smsmessage.xposed";
|
||||
public static final int EXPECTED_VERSION_CODE = 3;
|
||||
public static final String EXPECTED_VERSION_NAME = "1.2.0";
|
||||
public static final int EXPECTED_VERSION_CODE = 5;
|
||||
public static final String EXPECTED_VERSION_NAME = "1.2.2";
|
||||
|
||||
private MmpModuleInfo() {
|
||||
}
|
||||
|
||||
@@ -15,9 +15,16 @@ public class MmpPacket {
|
||||
public String total;
|
||||
public String via;
|
||||
public String issuedAt;
|
||||
public String expiresAt;
|
||||
/** TNG activityStatus:ACTIVE / FINISHED / ENDED / CLOSED / CANCELLED … */
|
||||
public String status;
|
||||
public String updatedAt;
|
||||
public boolean finished;
|
||||
public int snapshots;
|
||||
/** 已领人数(来自 TNG claimedCount,缺省用名单人数) */
|
||||
public int claimedCount;
|
||||
/** 红包总份数(TNG totalCount) */
|
||||
public int totalCount;
|
||||
public int claimantCount;
|
||||
public double sumClaimed;
|
||||
public List<MmpClaim> leaderboard = new ArrayList<>();
|
||||
@@ -74,10 +81,12 @@ public class MmpPacket {
|
||||
}
|
||||
|
||||
public String luckSummaryLine() {
|
||||
refreshClosedState();
|
||||
MmpClaim best = bestClaim();
|
||||
MmpClaim worst = worstClaim();
|
||||
String hi = finished ? "手气最佳" : "目前最高";
|
||||
String lo = finished ? "手气最差" : "目前最低";
|
||||
boolean closed = finished;
|
||||
String hi = closed ? "手气最佳" : "目前最高";
|
||||
String lo = closed ? "手气最差" : "目前最低";
|
||||
if (best == null) {
|
||||
return hi + ":- " + lo + ":-";
|
||||
}
|
||||
@@ -93,6 +102,87 @@ public class MmpPacket {
|
||||
return hi + ":" + bn + "(" + ba + ") " + lo + ":" + wn + "(" + wa + ")";
|
||||
}
|
||||
|
||||
/** 根据 expire/status/人数 刷新 finished;过期未领完也会标结束 */
|
||||
public void refreshClosedState() {
|
||||
if (isFullyClaimed()) {
|
||||
finished = true;
|
||||
return;
|
||||
}
|
||||
if (finished) {
|
||||
return;
|
||||
}
|
||||
if (isTerminalStatus(status) || isExpirePassed()) {
|
||||
finished = true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isExpired() {
|
||||
if (isExpirePassed()) {
|
||||
return true;
|
||||
}
|
||||
if (status == null) {
|
||||
return false;
|
||||
}
|
||||
String s = status.toUpperCase(Locale.US);
|
||||
return s.contains("EXPIRE") || s.contains("ENDED") || s.contains("CLOSED")
|
||||
|| s.contains("CANCEL");
|
||||
}
|
||||
|
||||
public boolean isFullyClaimed() {
|
||||
int claimed = effectiveClaimedCount();
|
||||
int total = effectiveTotalCount();
|
||||
return total > 0 && claimed >= total;
|
||||
}
|
||||
|
||||
public int effectiveClaimedCount() {
|
||||
return Math.max(claimedCount, claimantCount);
|
||||
}
|
||||
|
||||
public int effectiveTotalCount() {
|
||||
return Math.max(0, totalCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* 优先展示领取进度,过期放后面:
|
||||
* 已全部领取 / 已领取 N/M 人 · 已过期
|
||||
*/
|
||||
public String statusLabel() {
|
||||
refreshClosedState();
|
||||
String progress;
|
||||
if (isFullyClaimed()) {
|
||||
progress = "已全部领取";
|
||||
} else {
|
||||
int claimed = effectiveClaimedCount();
|
||||
int total = effectiveTotalCount();
|
||||
if (total > 0) {
|
||||
progress = "已领取 " + claimed + "/" + total + " 人";
|
||||
} else if (claimed > 0) {
|
||||
progress = "已领取 " + claimed + " 人";
|
||||
} else {
|
||||
progress = finished ? "未领取" : "领取中";
|
||||
}
|
||||
}
|
||||
if (isExpired() && !isFullyClaimed()) {
|
||||
return progress + " · 已过期";
|
||||
}
|
||||
return progress;
|
||||
}
|
||||
|
||||
private boolean isExpirePassed() {
|
||||
long ms = parseIssueMs(expiresAt);
|
||||
return ms > 0 && System.currentTimeMillis() >= ms;
|
||||
}
|
||||
|
||||
private static boolean isTerminalStatus(String status) {
|
||||
if (status == null || status.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
String s = status.toUpperCase(Locale.US);
|
||||
return s.contains("FINISH") || s.contains("COMPLETE") || s.contains("EXPIRE")
|
||||
|| s.contains("ENDED") || s.contains("CLOSED") || s.contains("CANCEL")
|
||||
|| s.contains("DONE");
|
||||
}
|
||||
|
||||
public boolean matchesFilter(String keyword, int statusFilter) {
|
||||
return matchesFilter(keyword, statusFilter, 0, 0L, 0L);
|
||||
}
|
||||
@@ -103,6 +193,7 @@ public class MmpPacket {
|
||||
*/
|
||||
public boolean matchesFilter(String keyword, int statusFilter,
|
||||
int timeMode, long customFromMs, long customToMs) {
|
||||
refreshClosedState();
|
||||
if (statusFilter == 1 && finished) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -96,14 +96,30 @@ public final class MmpPacketStore {
|
||||
incoming.total = nullToEmpty(parsed.meta.get("total"));
|
||||
incoming.via = nullToEmpty(parsed.meta.get("via"));
|
||||
incoming.issuedAt = firstNonEmpty(parsed.meta, "issued", "createTime", "issuedAt", "create");
|
||||
incoming.expiresAt = firstNonEmpty(parsed.meta, "expire", "expireTime", "expiry", "expiresAt");
|
||||
incoming.status = firstNonEmpty(parsed.meta, "status", "activityStatus");
|
||||
parseCountsMeta(incoming, parsed.meta.get("counts"));
|
||||
if (incoming.claimedCount <= 0) {
|
||||
tryParseIntField(incoming, parsed.meta, "claimed", "claimedCount");
|
||||
}
|
||||
if (incoming.totalCount <= 0) {
|
||||
tryParseIntField(incoming, parsed.meta, "slots", "totalCount", "quantity");
|
||||
}
|
||||
incoming.finished = "1".equals(parsed.meta.get("done"))
|
||||
|| "true".equalsIgnoreCase(parsed.meta.get("done"))
|
||||
|| "FINISHED".equalsIgnoreCase(parsed.meta.get("status"));
|
||||
|| isTerminalStatusMeta(incoming.status);
|
||||
incoming.refreshClosedState();
|
||||
incoming.updatedAt = nowText();
|
||||
incoming.snapshots = 1;
|
||||
List<MmpClaim> ranked = aggregateClaims(parsed.claims);
|
||||
incoming.leaderboard = ranked;
|
||||
incoming.claimantCount = ranked.size();
|
||||
if (incoming.claimedCount <= 0) {
|
||||
incoming.claimedCount = ranked.size();
|
||||
}
|
||||
if (incoming.totalCount > 0 && incoming.claimedCount >= incoming.totalCount) {
|
||||
incoming.finished = true;
|
||||
}
|
||||
double sum = 0;
|
||||
for (MmpClaim c : ranked) {
|
||||
sum += c.amount;
|
||||
@@ -127,9 +143,23 @@ public final class MmpPacketStore {
|
||||
if (TextUtils.isEmpty(incoming.issuedAt) && !TextUtils.isEmpty(existing.issuedAt)) {
|
||||
incoming.issuedAt = existing.issuedAt;
|
||||
}
|
||||
if (TextUtils.isEmpty(incoming.expiresAt) && !TextUtils.isEmpty(existing.expiresAt)) {
|
||||
incoming.expiresAt = existing.expiresAt;
|
||||
}
|
||||
if (TextUtils.isEmpty(incoming.status) && !TextUtils.isEmpty(existing.status)) {
|
||||
incoming.status = existing.status;
|
||||
}
|
||||
if (incoming.totalCount <= 0 && existing.totalCount > 0) {
|
||||
incoming.totalCount = existing.totalCount;
|
||||
}
|
||||
if (incoming.claimedCount < existing.claimedCount) {
|
||||
// 保留更大的已领人数
|
||||
incoming.claimedCount = existing.claimedCount;
|
||||
}
|
||||
if (!incoming.finished && existing.finished) {
|
||||
incoming.finished = true;
|
||||
}
|
||||
incoming.refreshClosedState();
|
||||
map.put(packetId, incoming);
|
||||
} else {
|
||||
existing.snapshots = existing.snapshots + 1;
|
||||
@@ -193,6 +223,11 @@ public final class MmpPacketStore {
|
||||
return nullToEmpty(b.packetId).compareTo(nullToEmpty(a.packetId));
|
||||
}
|
||||
});
|
||||
for (MmpPacket p : list) {
|
||||
if (p != null) {
|
||||
p.refreshClosedState();
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -213,7 +248,11 @@ public final class MmpPacketStore {
|
||||
return null;
|
||||
}
|
||||
synchronized (MmpPacketStore.class) {
|
||||
return loadMap(context).get(packetId);
|
||||
MmpPacket p = loadMap(context).get(packetId);
|
||||
if (p != null) {
|
||||
p.refreshClosedState();
|
||||
}
|
||||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -601,9 +640,13 @@ public final class MmpPacketStore {
|
||||
o.put("total", nullToEmpty(p.total));
|
||||
o.put("via", nullToEmpty(p.via));
|
||||
o.put("issuedAt", nullToEmpty(p.issuedAt));
|
||||
o.put("expiresAt", nullToEmpty(p.expiresAt));
|
||||
o.put("status", nullToEmpty(p.status));
|
||||
o.put("updatedAt", nullToEmpty(p.updatedAt));
|
||||
o.put("finished", p.finished);
|
||||
o.put("snapshots", p.snapshots);
|
||||
o.put("claimedCount", p.claimedCount);
|
||||
o.put("totalCount", p.totalCount);
|
||||
o.put("claimantCount", p.claimantCount);
|
||||
o.put("sumClaimed", p.sumClaimed);
|
||||
JSONArray board = new JSONArray();
|
||||
@@ -633,9 +676,16 @@ public final class MmpPacketStore {
|
||||
p.total = o.optString("total", "");
|
||||
p.via = o.optString("via", "");
|
||||
p.issuedAt = o.optString("issuedAt", "");
|
||||
p.expiresAt = o.optString("expiresAt", "");
|
||||
p.status = o.optString("status", "");
|
||||
p.updatedAt = o.optString("updatedAt", "");
|
||||
p.finished = o.optBoolean("finished", false);
|
||||
p.snapshots = o.optInt("snapshots", 1);
|
||||
p.claimedCount = o.optInt("claimedCount", 0);
|
||||
p.totalCount = o.optInt("totalCount", 0);
|
||||
p.claimantCount = o.optInt("claimantCount", 0);
|
||||
p.refreshClosedState();
|
||||
p.snapshots = o.optInt("snapshots", 1);
|
||||
p.claimantCount = o.optInt("claimantCount", 0);
|
||||
p.sumClaimed = o.optDouble("sumClaimed", 0);
|
||||
JSONArray board = o.optJSONArray("leaderboard");
|
||||
@@ -657,6 +707,10 @@ public final class MmpPacketStore {
|
||||
if (p.claimantCount <= 0) {
|
||||
p.claimantCount = p.leaderboard.size();
|
||||
}
|
||||
if (p.claimedCount <= 0) {
|
||||
p.claimedCount = p.claimantCount;
|
||||
}
|
||||
p.refreshClosedState();
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -684,6 +738,66 @@ public final class MmpPacketStore {
|
||||
return "";
|
||||
}
|
||||
|
||||
/** counts=1/5 */
|
||||
private static void parseCountsMeta(MmpPacket packet, String counts) {
|
||||
if (packet == null || TextUtils.isEmpty(counts)) {
|
||||
return;
|
||||
}
|
||||
String raw = counts.trim();
|
||||
int slash = raw.indexOf('/');
|
||||
try {
|
||||
if (slash >= 0) {
|
||||
String left = raw.substring(0, slash).trim();
|
||||
String right = raw.substring(slash + 1).trim();
|
||||
if (!left.isEmpty()) {
|
||||
packet.claimedCount = Integer.parseInt(left);
|
||||
}
|
||||
if (!right.isEmpty()) {
|
||||
packet.totalCount = Integer.parseInt(right);
|
||||
}
|
||||
} else {
|
||||
packet.claimedCount = Integer.parseInt(raw);
|
||||
}
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
private static void tryParseIntField(MmpPacket packet, Map<String, String> meta,
|
||||
String... keys) {
|
||||
if (packet == null || meta == null) {
|
||||
return;
|
||||
}
|
||||
for (String k : keys) {
|
||||
String v = meta.get(k);
|
||||
if (TextUtils.isEmpty(v)) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
int n = Integer.parseInt(v.trim());
|
||||
if (n < 0) {
|
||||
continue;
|
||||
}
|
||||
if ("claimed".equals(k) || "claimedCount".equals(k)) {
|
||||
packet.claimedCount = n;
|
||||
} else {
|
||||
packet.totalCount = n;
|
||||
}
|
||||
return;
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isTerminalStatusMeta(String status) {
|
||||
if (TextUtils.isEmpty(status)) {
|
||||
return false;
|
||||
}
|
||||
String s = status.toUpperCase(Locale.US);
|
||||
return s.contains("FINISH") || s.contains("COMPLETE") || s.contains("EXPIRE")
|
||||
|| s.contains("ENDED") || s.contains("CLOSED") || s.contains("CANCEL")
|
||||
|| s.contains("DONE");
|
||||
}
|
||||
|
||||
private static String nowText() {
|
||||
return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
||||
.format(new java.util.Date());
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:maxLines="2"
|
||||
android:text="-"
|
||||
android:textColor="#047857"
|
||||
android:textSize="16sp"
|
||||
@@ -219,7 +219,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:maxLines="2"
|
||||
android:text="-"
|
||||
android:textColor="#B45309"
|
||||
android:textSize="16sp"
|
||||
|
||||
@@ -16,17 +16,34 @@
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:text="红包"
|
||||
android:textColor="#111827"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:text="红包"
|
||||
android:textColor="#111827"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_id"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="middle"
|
||||
android:maxLines="1"
|
||||
android:text=""
|
||||
android:textColor="#9CA3AF"
|
||||
android:textSize="11sp"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_sum"
|
||||
@@ -71,17 +88,6 @@
|
||||
android:text="0 人"
|
||||
android:textColor="#6B7280"
|
||||
android:textSize="11sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_id"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:ellipsize="middle"
|
||||
android:maxLines="1"
|
||||
android:text="id"
|
||||
android:textColor="#9CA3AF"
|
||||
android:textSize="10sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
@@ -97,7 +103,7 @@
|
||||
android:layout_weight="1"
|
||||
android:background="#ECFDF5"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:maxLines="2"
|
||||
android:paddingStart="6dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingEnd="6dp"
|
||||
@@ -115,7 +121,7 @@
|
||||
android:layout_weight="1"
|
||||
android:background="#FFFBEB"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:maxLines="2"
|
||||
android:paddingStart="6dp"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingEnd="6dp"
|
||||
|
||||
Reference in New Issue
Block a user