1:修改测试出来的bug,关于:身价、我的家族、歌手认证、挚友、房间心跳、

This commit is contained in:
2025-12-02 19:26:37 +08:00
parent 8ce028379c
commit d94d7a75df
24 changed files with 239 additions and 77 deletions

View File

@@ -1,5 +1,6 @@
package com.xscm.moduleutil.bean; package com.xscm.moduleutil.bean;
import java.io.Serializable;
import java.util.List; import java.util.List;
import lombok.Data; import lombok.Data;
@@ -10,7 +11,7 @@ import lombok.Data;
* @Description $ * @Description $
*/ */
@Data @Data
public class CombinedGiftBean { public class CombinedGiftBean implements Serializable {
private int gift_id; private int gift_id;
private String gift_price; private String gift_price;
private String gift_name; private String gift_name;
@@ -21,7 +22,7 @@ public class CombinedGiftBean {
private boolean is_liang; private boolean is_liang;
@Data @Data
public static class TopUsers { public static class TopUsers implements Serializable{
private int user_id; private int user_id;
private String nickname; private String nickname;
private String avatar; private String avatar;

View File

@@ -1,5 +1,6 @@
package com.xscm.moduleutil.bean; package com.xscm.moduleutil.bean;
import java.io.Serializable;
import java.util.List; import java.util.List;
import lombok.Data; import lombok.Data;
@@ -10,11 +11,11 @@ import lombok.Data;
* @Description $ 礼物墙展示接口 * @Description $ 礼物墙展示接口
*/ */
@Data @Data
public class GiftUserWallBean { public class GiftUserWallBean implements Serializable {
private List<GiftWallBean> liang; private List<GiftWallBean> liang;
private List<GiftWallBean> no_liang; private List<GiftWallBean> no_liang;
@Data @Data
public static class GiftWallBean { public static class GiftWallBean implements Serializable {
private int gift_id; private int gift_id;
private String gift_price; private String gift_price;
private String gift_name; private String gift_name;

View File

@@ -85,6 +85,8 @@ public class UserInfo extends BaseEvent implements Serializable {
private int singer_level;//歌手等级 private int singer_level;//歌手等级
private CpInfo cp_info; private CpInfo cp_info;
private int market_value;//身价 private int market_value;//身价
private String market_value_coin="";//身价配置 多少金币数
private String market_value_market="";//身价配置 多少身价数
private String sign_value; private String sign_value;
private String sign_id; private String sign_id;

View File

@@ -617,8 +617,9 @@ public interface ApiServer {
@POST(Constants.DELAY) @POST(Constants.DELAY)
Call<BaseModel<String>> delay(@Field("friend_id") String friend_id, @Field("room_id") String room_id, @Field("delay_times") String delay_times); Call<BaseModel<String>> delay(@Field("friend_id") String friend_id, @Field("room_id") String room_id, @Field("delay_times") String delay_times);
@FormUrlEncoded
@POST(Constants.POST_KEEP_XINTIAO) @POST(Constants.POST_KEEP_XINTIAO)
Call<ResponseBody> keepXintiao(); Call<ResponseBody> keepXintiao(@Field("room_id") String room_id);
@FormUrlEncoded @FormUrlEncoded
@POST(Constants.DOWN_PIT) @POST(Constants.DOWN_PIT)

View File

@@ -3324,8 +3324,8 @@ public class RetrofitClient {
}); });
} }
public void keepXintiao() { public void keepXintiao(String roomId) {
sApiServer.keepXintiao().enqueue(new Callback<ResponseBody>() { sApiServer.keepXintiao(roomId).enqueue(new Callback<ResponseBody>() {
@Override @Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

View File

@@ -391,7 +391,7 @@ public class Constants {
public static final String GET_THEME_DATA = "/api/Theme/get_theme_data";//主题接口 public static final String GET_THEME_DATA = "/api/Theme/get_theme_data";//主题接口
public static final String START_FRIEND = "/api/Friend/start_friend";//点击开始按钮 交友房 public static final String START_FRIEND = "/api/Friend/start_friend";//点击开始按钮 交友房
public static final String DELAY = "/api/Friend/delay";//点击延时 交友房 public static final String DELAY = "/api/Friend/delay";//点击延时 交友房
public static final String POST_KEEP_XINTIAO = "/api/Xintiao/keep_xintiao";//心跳 public static final String POST_KEEP_XINTIAO = "/api/Xintiao/keep_room_heartbeat";//心跳
public static final String END_FRIEND = "/api/Friend/end_friend";//点击结束 交友房 public static final String END_FRIEND = "/api/Friend/end_friend";//点击结束 交友房
public static final String CREATE_RELATION = "/api/Friend/create_relation";//卡关系 (创建关系) 交友房 public static final String CREATE_RELATION = "/api/Friend/create_relation";//卡关系 (创建关系) 交友房
public static final String GET_BOX_GIFT_LIST = "/api/BlindBoxTurntable/get_gift_list";//获取活动礼物列表 public static final String GET_BOX_GIFT_LIST = "/api/BlindBoxTurntable/get_gift_list";//获取活动礼物列表

View File

@@ -40,7 +40,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_2" android:layout_marginStart="@dimen/dp_2"
android:textColor="#CCA882" android:textColor="@color/white"
android:textSize="@dimen/sp_12" android:textSize="@dimen/sp_12"
app:isShine="false" app:isShine="false"
app:layout_constraintStart_toEndOf="@+id/avatar" app:layout_constraintStart_toEndOf="@+id/avatar"

View File

@@ -1,8 +1,11 @@
package com.xscm.modulemain.activity.room.fragment package com.xscm.modulemain.activity.room.fragment
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.os.Vibrator
import android.view.Gravity import android.view.Gravity
import android.view.HapticFeedbackConstants
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.PopupWindow import android.widget.PopupWindow
@@ -411,7 +414,6 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) :
override fun signCoinList(list: List<String>) { override fun signCoinList(list: List<String>) {
MvpPre!!.wallet(list) MvpPre!!.wallet(list)
} }
override fun wallet(list: List<String>, walletBean: WalletBean?) { override fun wallet(list: List<String>, walletBean: WalletBean?) {
if (dialogMentorShip == null) { if (dialogMentorShip == null) {
dialogMentorShip = DialogMentorShip(ActivityUtils.getTopActivity()) dialogMentorShip = DialogMentorShip(ActivityUtils.getTopActivity())
@@ -419,6 +421,10 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) :
dialogMentorShip?.show(list, mSignPitBean, walletBean, dialogMentorShip?.show(list, mSignPitBean, walletBean,
object : DialogMentorShip.OnItemClickListener { object : DialogMentorShip.OnItemClickListener {
override fun onItemClick(coin: String) { override fun onItemClick(coin: String) {
// 触发轻微震动
view?.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
MvpPre!!.signCoin(mSignId!!, coin) MvpPre!!.signCoin(mSignId!!, coin)
} }
}) })

View File

@@ -164,7 +164,7 @@ public class NobleDetailsActivity extends BaseMvpActivity<NobleTitlePresenter, A
mBinding.tvNobleMob.setText(nobilitLists.getPay_price()+" / "+nobilitLists.getDay()+""); mBinding.tvNobleMob.setText(nobilitLists.getPay_price()+" / "+nobilitLists.getDay()+"");
gridView.setAdapter(mGiftWallAdapter); gridView.setAdapter(mGiftWallAdapter);
lid=nobilitLists.getLid()+"";
// 观察数据变化并更新 GridView // 观察数据变化并更新 GridView
mGiftWallAdapter.updateData(nobilitLists.getPower().getList()); mGiftWallAdapter.updateData(nobilitLists.getPower().getList());
if (position>=index){ if (position>=index){
@@ -182,7 +182,7 @@ public class NobleDetailsActivity extends BaseMvpActivity<NobleTitlePresenter, A
mBinding.imLjkt.setImageResource(com.xscm.moduleutil.R.mipmap.noble_h_kt); mBinding.imLjkt.setImageResource(com.xscm.moduleutil.R.mipmap.noble_h_kt);
mBinding.imLjkt.setClickable( false); mBinding.imLjkt.setClickable( false);
} }
// lid=nobilitLists.getLid()+"";
xlid=nobilitLists.getLid()+""; xlid=nobilitLists.getLid()+"";
} }
private void applyGradientToTextView(TextView textView) { private void applyGradientToTextView(TextView textView) {

View File

@@ -24,12 +24,16 @@ import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.blankj.utilcode.util.ActivityUtils;
import com.xscm.modulemain.BaseMvpActivity; import com.xscm.modulemain.BaseMvpActivity;
import com.xscm.modulemain.R; import com.xscm.modulemain.R;
import com.xscm.modulemain.activity.user.conacts.SingerVerificationContract; import com.xscm.modulemain.activity.user.conacts.SingerVerificationContract;
import com.xscm.modulemain.activity.user.presenter.SingerVerificationPresenter; import com.xscm.modulemain.activity.user.presenter.SingerVerificationPresenter;
import com.xscm.modulemain.databinding.ActivitySingerVerificationBinding; import com.xscm.modulemain.databinding.ActivitySingerVerificationBinding;
import com.xscm.modulemain.dialog.DialogWebView;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.SongPlaylist; import com.xscm.moduleutil.bean.SongPlaylist;
import com.xscm.moduleutil.widget.CustomTopBar;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -180,6 +184,16 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
protected void initData() { protected void initData() {
mBinding.topBar.setTitle("歌手认证"); mBinding.topBar.setTitle("歌手认证");
mBinding.topBar.setColor(getResources().getColor(R.color.white)); mBinding.topBar.setColor(getResources().getColor(R.color.white));
mBinding.topBar.setRightIcon(R.mipmap.icon_heart_help);
mBinding.topBar.setImgPaddingRight(35);
mBinding.topBar.setRightImgVIsible(true);
mBinding.topBar.addIntentListener(new CustomTopBar.OnCallBackRightIcon() {
@Override
public void onIntent() {
DialogWebView dialogWebView=new DialogWebView(ActivityUtils.getTopActivity());
dialogWebView.show(CommonAppContext.getInstance().currentEnvironment.getServerUrl()+"api/Page/page_show?id=33");
}
});
isSinger= getIntent().getIntExtra("isSinger",-1); isSinger= getIntent().getIntExtra("isSinger",-1);
if (isSinger==-1){ if (isSinger==-1){
mBinding.clCorner.setVisibility(VISIBLE); mBinding.clCorner.setVisibility(VISIBLE);
@@ -330,6 +344,8 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
if (recordingSegments.size() > 1) { if (recordingSegments.size() > 1) {
// 如果有多个录音片段,合并它们 // 如果有多个录音片段,合并它们
mergeAudioFiles(); mergeAudioFiles();
// 更新录音时长为所有片段的总时长
updateRecordingDuration();
} else if (recordingSegments.size() == 1) { } else if (recordingSegments.size() == 1) {
// 只有一个录音片段,直接使用 // 只有一个录音片段,直接使用
recordingFile = recordingSegments.get(0); recordingFile = recordingSegments.get(0);
@@ -373,9 +389,11 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
return; return;
} }
// 检查录音时长是否达到最小要求60秒 // 移除试听时间限制,允许试听任何长度的录音
if (recordingDuration < 60 * 1000) { if (recordingDuration <= 0) {
Toast.makeText(this, "录音时间太短请至少录制60秒", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "没有可试听的内容", Toast.LENGTH_SHORT).show();
mBinding.playButton.setText("试听");
mBinding.playButton.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.but_st, 0, 0);
return; return;
} }
@@ -523,7 +541,7 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
// 检查录音时长是否达到最小要求60秒 // 检查录音时长是否达到最小要求60秒
if (recordingDuration < 60 * 1000) { if (recordingDuration < 60 * 1000) {
Toast.makeText(this, "录音时间太短请至少录制60秒", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "录音时间不足60秒无法提交认证", Toast.LENGTH_SHORT).show();
return; return;
} }
@@ -819,6 +837,31 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
}, 2000); // 延迟2秒删除确保合并文件已经完全写入 }, 2000); // 延迟2秒删除确保合并文件已经完全写入
} }
/**
* 更新录音时长为所有片段的总时长
* 当合并多个录音片段后,需要更新总的录音时长
*/
private void updateRecordingDuration() {
if (recordingFile == null || !recordingFile.exists()) {
Log.e("SingerVerification", "录音文件不存在,无法更新时长");
return;
}
try {
// 使用MediaPlayer获取文件时长
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(recordingFile.getAbsolutePath());
mp.prepare();
recordingDuration = mp.getDuration();
mp.release();
Log.d("SingerVerification", "更新录音时长为: " + recordingDuration + "ms");
updateUI();
} catch (Exception e) {
Log.e("SingerVerification", "获取录音时长失败: " + e.getMessage());
}
}
// 这些WAV处理方法已不再需要因为我们现在使用MediaMuxer处理M4A文件 // 这些WAV处理方法已不再需要因为我们现在使用MediaMuxer处理M4A文件

View File

@@ -176,7 +176,7 @@ class UserFamilyActivity : BaseMvpActivity<UserFamilyPresenter, ActivityUserFami
if (type == 2) { if (type == 2) {
ToastUtils.showLong("您还没有加入任何家族") ToastUtils.showLong("您还没有加入任何家族")
// 切换回"我的家族"tab // 切换回"我的家族"tab
mBinding.tabLayout.selectTab(mBinding.tabLayout.getTabAt(0)) // mBinding.tabLayout.selectTab(mBinding.tabLayout.getTabAt(0))
} else { } else {
ToastUtils.showLong("没有数据") ToastUtils.showLong("没有数据")
} }

View File

@@ -15,6 +15,8 @@ import com.xscm.modulemain.activity.user.conacts.SingerVerificationContract;
import com.xscm.modulemain.activity.user.presenter.SingerVerificationPresenter; import com.xscm.modulemain.activity.user.presenter.SingerVerificationPresenter;
import com.xscm.modulemain.databinding.ActivityUserPlaylistBinding; import com.xscm.modulemain.databinding.ActivityUserPlaylistBinding;
import com.xscm.modulemain.dialog.CustomInputDialog; import com.xscm.modulemain.dialog.CustomInputDialog;
import com.xscm.modulemain.dialog.DialogWebView;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.SongPlaylist; import com.xscm.moduleutil.bean.SongPlaylist;
import com.xscm.moduleutil.utils.SpUtil; import com.xscm.moduleutil.utils.SpUtil;
@@ -80,8 +82,11 @@ public class UserPlaylistActivity extends BaseMvpActivity<SingerVerificationPres
} }
}); });
customInputDialog.show(); customInputDialog.show();
});
mBinding.imHelp.setOnClickListener(v -> {
new DialogWebView(this).show(CommonAppContext.getInstance().currentEnvironment.getServerUrl()
+ "api/Page/page_show?id=34");
}); });
// 设置删除点击事件 // 设置删除点击事件

View File

@@ -36,7 +36,10 @@ class JoinedFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentJoined
} }
override fun initData() { override fun initData() {
myFamily1(data) // 确保data不为null再调用myFamily1
if (data != null) {
myFamily1(data)
}
} }
override fun initView() { override fun initView() {
@@ -81,43 +84,77 @@ class JoinedFamilyFragment(var data: MyFamilyBean) : BaseFragment<FragmentJoined
*/ */
fun setMyFamilyBean(myBean: MyFamilyBean) { fun setMyFamilyBean(myBean: MyFamilyBean) {
this.myFamilyBean = myBean this.myFamilyBean = myBean
myFamily1(myBean) myFamily1(myBean)
} }
fun myFamily1(data: MyFamilyBean) { fun myFamily1(data: MyFamilyBean) {
if (data == null) return
myFamilyBean= data myFamilyBean= data
userId = data.user_id userId = data.user_id
dataList.clear() dataList.clear()
dataList.addAll(data.group_members_lists) dataList.addAll(data.group_members_lists)
mBinding.headView.setData(data.group_owner_info?.avatar,data.group_owner_info?.dress,data.group_owner_info?.nobility_image) // 安全地处理group_owner_info可能为null的情况
mBinding.tvUserName.text = data.group_owner_info?.nickname val groupOwnerInfo = data.group_owner_info
if (data.group_owner_info?.nickname_color?.isNotEmpty()==true){ if (groupOwnerInfo == null || groupOwnerInfo.nickname.isNullOrEmpty()) {
mBinding.tvUserName.startColor = Color.parseColor(data.group_owner_info?.nickname_color) mBinding.clZu.visibility = View.GONE
mBinding.tvUserName.shineColor = Color.parseColor(data.group_owner_info?.nickname_color) mBinding.tvMeJz.visibility= View.GONE
mBinding.tvUserName.endColor = Color.parseColor(data.group_owner_info?.nickname_color) } else {
mBinding.tvUserName.isShine = true mBinding.clZu.visibility = View.VISIBLE
mBinding.tvUserName.shineType = 0 mBinding.tvMeJz.visibility= View.VISIBLE
} }
mBinding.tvUserId.setText("ID: ${data.group_owner_info?.user_code}") // 安全地设置headView数据
mBinding.tvZsyNum.text = data.group_earnings if (groupOwnerInfo != null) {
mBinding.tvSignNum.setText("群组人数:${data.group_members_num}") mBinding.headView.setData(
groupOwnerInfo.avatar,
groupOwnerInfo.dress,
groupOwnerInfo.nobility_image
)
}
// 安全地设置用户名
mBinding.tvUserName.text = groupOwnerInfo?.nickname ?: ""
adapter = MyFamilyAdapter(activity!!,userId, R.layout.item_family_members, dataList) // 安全地设置用户名颜色
mBinding.recyclerView.adapter = adapter if (groupOwnerInfo != null && !groupOwnerInfo.nickname_color.isNullOrEmpty()) {
val commonEmptyView = CommonEmptyView(activity!!) try {
commonEmptyView.setImg(R.mipmap.ic_empty) mBinding.tvUserName.startColor = Color.parseColor(groupOwnerInfo.nickname_color)
commonEmptyView.setTextColor(getResources().getColor(com.xscm.moduleutil.R.color.color_FFBDBDBC)) mBinding.tvUserName.shineColor = Color.parseColor(groupOwnerInfo.nickname_color)
adapter?.bindToRecyclerView(mBinding.recyclerView) mBinding.tvUserName.endColor = Color.parseColor(groupOwnerInfo.nickname_color)
adapter?.setEmptyView(commonEmptyView) mBinding.tvUserName.isShine = true
adapter?.setOnItemChildClickListener { adapter, view, position -> mBinding.tvUserName.shineType = 0
if (view.id == R.id.iv_head) { } catch (e: IllegalArgumentException) {
val item = dataList[position] // 如果颜色解析失败,使用默认颜色
val intent = Intent(activity, UserHomepageActivity::class.java) e.printStackTrace()
intent.putExtra("userId", item.user_id.toString() + "") mBinding.tvUserName.setTextColor(Color.parseColor("#212121"))
startActivity(intent) mBinding.tvUserName.isShine = false
}
}
// 安全地设置用户ID
mBinding.tvUserId.setText("ID: ${groupOwnerInfo?.user_code ?: ""}")
mBinding.tvZsyNum.text = data.group_earnings ?: "0"
// 安全地设置群组人数
mBinding.tvSignNum.setText("群组人数:${data.group_members_num ?: 0}")
// 确保activity不为null
if (activity != null) {
adapter = MyFamilyAdapter(activity!!, userId, R.layout.item_family_members, dataList)
mBinding.recyclerView.adapter = adapter
val commonEmptyView = CommonEmptyView(activity!!)
commonEmptyView.setImg(R.mipmap.ic_empty)
commonEmptyView.setTextColor(getResources().getColor(com.xscm.moduleutil.R.color.color_FFBDBDBC))
adapter?.bindToRecyclerView(mBinding.recyclerView)
adapter?.setEmptyView(commonEmptyView)
adapter?.setOnItemChildClickListener { adapter, view, position ->
if (view.id == R.id.iv_head) {
val item = dataList[position]
val intent = Intent(activity, UserHomepageActivity::class.java)
intent.putExtra("userId", item.user_id.toString() + "")
startActivity(intent)
}
} }
} }
} }

View File

@@ -205,8 +205,9 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
break; break;
case 2: case 2:
AdaptiveImageView emojiImageView = helper.getView(com.xscm.moduleutil.R.id.im_emj); AdaptiveImageView emojiImageView = helper.getView(com.xscm.moduleutil.R.id.im_emj);
emojiImageView.setTag(""); // 清除之前的图片加载任务,防止图片显示在错误的位置
Glide.with(mContext).clear(emojiImageView); Glide.with(mContext).clear(emojiImageView);
emojiImageView.setTag(null);
emojiImageView.setVisibility(View.VISIBLE); emojiImageView.setVisibility(View.VISIBLE);
helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.GONE); helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.GONE);
@@ -214,6 +215,9 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
avatar.setData(emMessage.getText().getFromUserInfo().getAvatar(), "", emMessage.getText().getFromUserInfo().getNobility_image()); avatar.setData(emMessage.getText().getFromUserInfo().getAvatar(), "", emMessage.getText().getFromUserInfo().getNobility_image());
// ImageUtils.loadHeadCC(emMessage.getText().getFromUserInfo().getAvatar(), helper.getView(com.xscm.moduleutil.R.id.avatar)); // ImageUtils.loadHeadCC(emMessage.getText().getFromUserInfo().getAvatar(), helper.getView(com.xscm.moduleutil.R.id.avatar));
ShineTextView tvName = helper.getView(com.xscm.moduleutil.R.id.tv_name); ShineTextView tvName = helper.getView(com.xscm.moduleutil.R.id.tv_name);
// 先重置tvName状态防止复用时出现混乱
tvName.setShine(false);
tvName.clearAnimation();
tvName.setText(emMessage.getText().getFromUserInfo().getNickname()); tvName.setText(emMessage.getText().getFromUserInfo().getNickname());
if (!emMessage.getText().getFromUserInfo().getNickname_color().isEmpty()) { if (!emMessage.getText().getFromUserInfo().getNickname_color().isEmpty()) {
@@ -222,6 +226,12 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
tvName.setEndColor(Color.parseColor(emMessage.getText().getFromUserInfo().getNickname_color())); tvName.setEndColor(Color.parseColor(emMessage.getText().getFromUserInfo().getNickname_color()));
tvName.setShine(true); tvName.setShine(true);
tvName.setShineType(0); tvName.setShineType(0);
}else {
tvName.setStartColor(Color.parseColor("#FFFFFFFF"));
tvName.setShineColor(Color.parseColor("#FFFFFFFF"));
tvName.setEndColor(Color.parseColor("#FFFFFFFF"));
tvName.setShine(true);
tvName.setShineType(1);
} }
// helper.setTextColor(com.xscm.moduleutil.R.id.tv_name, emMessage.getText().getFromUserInfo().getNickname_color() != null && !emMessage.getText().getFromUserInfo().getNickname_color().isEmpty() ? Color.parseColor(emMessage.getText().getFromUserInfo().getNickname_color()) : Color.parseColor("#CCA882")); // helper.setTextColor(com.xscm.moduleutil.R.id.tv_name, emMessage.getText().getFromUserInfo().getNickname_color() != null && !emMessage.getText().getFromUserInfo().getNickname_color().isEmpty() ? Color.parseColor(emMessage.getText().getFromUserInfo().getNickname_color()) : Color.parseColor("#CCA882"));
@@ -249,6 +259,11 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
} }
} }
// 为聊天气泡设置唯一标识,防止异步加载后应用到错误的视图
String bubbleId = emMessage.getRoomId() + "_" + helper.getLayoutPosition() + "_bubble";
View bubbleView = helper.getView(com.xscm.moduleutil.R.id.bubble);
bubbleView.setTag(bubbleId);
if (emMessage.getText().getFromUserInfo().getChat_bubble() != null && !emMessage.getText().getFromUserInfo().getChat_bubble().isEmpty()) { if (emMessage.getText().getFromUserInfo().getChat_bubble() != null && !emMessage.getText().getFromUserInfo().getChat_bubble().isEmpty()) {
// 使用 Glide 加载图片并设置名称 // 使用 Glide 加载图片并设置名称
String imageUrl = emMessage.getText().getFromUserInfo().getChat_bubble(); String imageUrl = emMessage.getText().getFromUserInfo().getChat_bubble();
@@ -257,30 +272,39 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
.into(new SimpleTarget<Drawable>() { .into(new SimpleTarget<Drawable>() {
@Override @Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
// 将资源转换为 Bitmap // 检查视图是否仍属于当前数据项
if (resource instanceof BitmapDrawable) { if (bubbleId.equals(bubbleView.getTag())) {
Bitmap bitmap = ((BitmapDrawable) resource).getBitmap(); // 将资源转换为 Bitmap
// 创建新的文件名 if (resource instanceof BitmapDrawable) {
Drawable fakeNinePatch = new FakeNinePatchDrawable(bitmap, 0.4f, 0.4f, 0.6f, 0.5f); Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
// 创建新的文件名
Drawable fakeNinePatch = new FakeNinePatchDrawable(bitmap, 0.4f, 0.4f, 0.6f, 0.5f);
// 保存图片到本地 // 设置背景
helper.getView(com.xscm.moduleutil.R.id.bubble).setBackground(fakeNinePatch); bubbleView.setBackground(fakeNinePatch);
}
} }
} }
@Override @Override
public void onLoadFailed(@Nullable Drawable errorDrawable) { public void onLoadFailed(@Nullable Drawable errorDrawable) {
// 加载失败处理 // 检查视图是否仍属于当前数据项
if (bubbleId.equals(bubbleView.getTag())) {
// 加载失败时使用默认背景
bubbleView.setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg);
}
} }
}); });
} else { } else {
helper.getView(com.xscm.moduleutil.R.id.bubble).setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg); // 检查视图是否仍属于当前数据项
if (bubbleId.equals(bubbleView.getTag())) {
bubbleView.setBackgroundResource(com.xscm.moduleutil.R.drawable.ease_row_pubilc_user_bg);
}
} }
if (emMessage.getText().getEmoji() != null && emMessage.getText().getEmoji().getAnimate_image() != null) { if (emMessage.getText().getEmoji() != null && emMessage.getText().getEmoji().getAnimate_image() != null) {
// 为每个加载任务设置唯一标识 // 为每个加载任务设置唯一标识
String uniqueId = emMessage.getRoomId() + "_" + helper.getLayoutPosition(); String uniqueId = emMessage.getRoomId() + "_" + helper.getLayoutPosition() + "_emoji";
emojiImageView.setTag(uniqueId); emojiImageView.setTag(uniqueId);
//这段代码使用 Optional 链式调用安全地获取 emMessage 中的 animate_image 字段,避免空指针异常。如果任意环节为 null则返回空字符串。 //这段代码使用 Optional 链式调用安全地获取 emMessage 中的 animate_image 字段,避免空指针异常。如果任意环节为 null则返回空字符串。
@@ -324,19 +348,31 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
@Override @Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target,
boolean isFirstResource) { boolean isFirstResource) {
// 加载失败时检查视图是否仍属于当前数据项
if (uniqueId.equals(emojiImageView.getTag())) {
// 加载静态表情作为备选
Glide.with(mContext)
.load(emMessage.getText().getEmoji().getImage())
.into(emojiImageView);
}
return false; return false;
} }
}) })
.into(emojiImageView); .into(emojiImageView);
} else { } else {
Glide.with(mContext) // 检查视图是否仍属于当前数据项
.load(emMessage.getText().getEmoji().getImage()) if (uniqueId.equals(emojiImageView.getTag())) {
.into(emojiImageView); Glide.with(mContext)
.load(emMessage.getText().getEmoji().getImage())
.into(emojiImageView);
}
} }
} else { } else {
// 确保在非表情情况下,重置视图状态
helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.VISIBLE); helper.getView(com.xscm.moduleutil.R.id.tv_content).setVisibility(View.VISIBLE);
emojiImageView.setVisibility(View.GONE); emojiImageView.setVisibility(View.GONE);
// 清除可能存在的异步加载任务
Glide.with(mContext).clear(emojiImageView);
} }
break; break;
case 3: case 3:
@@ -412,6 +448,13 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter<EMMessageInfo, Ba
ivCharm.setImageDrawable(null); ivCharm.setImageDrawable(null);
Glide.with(ivCharm.getContext()).clear(ivCharm); Glide.with(ivCharm.getContext()).clear(ivCharm);
} }
// 重置tvName的闪动状态防止复用时出现混乱
ShineTextView tvName = holder.getView(com.xscm.moduleutil.R.id.tv_name);
if (tvName != null) {
tvName.setShine(false);
tvName.clearAnimation();
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -91,7 +91,7 @@ public class CustomInputDialog extends BaseDialog<DialogCustomInputBinding> {
public void onGiftConfirm(String giftId, String name, String giftNum) { public void onGiftConfirm(String giftId, String name, String giftNum) {
mGiftId = giftId; mGiftId = giftId;
mGiftNum = giftNum; mGiftNum = giftNum;
mBinding.tvClickable.setText(name); mBinding.tvClickable.setText(name+" x"+giftNum);
} }
}); });

View File

@@ -36,6 +36,7 @@ class UserNetWorthDialog(context: Context) :
private fun setupViews() { private fun setupViews() {
userInfo= SpUtil.getUserInfo() userInfo= SpUtil.getUserInfo()
mBinding.tv2.setText(userInfo.market_value.toString()) mBinding.tv2.setText(userInfo.market_value.toString())
mBinding.tvSlsjValue.text="收礼身价,等于 通过累计收礼的价值,每${userInfo.market_value_coin}个金币等于${userInfo.market_value_market}身价"
} }
private fun setupWindow() { private fun setupWindow() {

View File

@@ -5,6 +5,7 @@ import android.content.Intent
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import com.tencent.imsdk.v2.V2TIMManager import com.tencent.imsdk.v2.V2TIMManager
import com.xscm.moduleutil.base.CommonAppContext
import com.xscm.moduleutil.http.RetrofitClient import com.xscm.moduleutil.http.RetrofitClient
import java.util.* import java.util.*
@@ -21,7 +22,7 @@ class ForegroundService : Service() {
timer?.schedule(object : TimerTask() { timer?.schedule(object : TimerTask() {
override fun run() { override fun run() {
Log.d("ForegroundService", "Timer task ${logInt++}") Log.d("ForegroundService", "Timer task ${logInt++}")
RetrofitClient.getInstance().keepXintiao(); RetrofitClient.getInstance().keepXintiao(CommonAppContext.getInstance().playId);
} }
}, 0L, 60000L) }, 0L, 60000L)
} }

View File

@@ -22,8 +22,20 @@
app:layout_constraintTop_toBottomOf="@+id/top_bar" app:layout_constraintTop_toBottomOf="@+id/top_bar"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="@dimen/dp_16" android:layout_marginStart="@dimen/dp_16"
android:textColor="@color/color_666666"
/> />
<ImageView
android:id="@+id/im_help"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/icon_heart_help"
app:layout_constraintTop_toBottomOf="@+id/top_bar"
app:layout_constraintBottom_toBottomOf="@+id/tv_num"
app:layout_constraintEnd_toEndOf="parent"
android:tint="@color/color_666666"
android:layout_marginEnd="@dimen/dp_16"/>
<com.scwang.smartrefresh.layout.SmartRefreshLayout <com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/smart_refresh_layout" android:id="@+id/smart_refresh_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -31,7 +43,7 @@
android:layout_marginStart="@dimen/dp_16" android:layout_marginStart="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_16" android:layout_marginEnd="@dimen/dp_16"
android:background="@drawable/bg_r16_fff" android:background="@drawable/bg_r16_fff"
android:layout_marginTop="@dimen/dp_9" android:layout_marginTop="@dimen/dp_10"
app:layout_constraintTop_toBottomOf="@id/tv_num" app:layout_constraintTop_toBottomOf="@id/tv_num"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:srlEnableLoadMore="true" app:srlEnableLoadMore="true"

View File

@@ -65,7 +65,7 @@
android:marqueeRepeatLimit="marquee_forever" android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true" android:scrollHorizontally="true"
android:singleLine="true" android:singleLine="true"
android:text="x1" android:text="1"
android:textColor="@color/color_FF333333" android:textColor="@color/color_FF333333"
android:textSize="@dimen/sp_14" /> android:textSize="@dimen/sp_14" />

View File

@@ -34,7 +34,8 @@
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -246,11 +247,11 @@
android:id="@+id/rv_my_relationship" android:id="@+id/rv_my_relationship"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
android:clipToPadding="false"
android:paddingBottom="@dimen/dp_200"
tools:listitem="@layout/item_relationship_list" /> tools:listitem="@layout/item_relationship_list" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_45" />
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>

View File

@@ -10,15 +10,14 @@
android:orientation="vertical"> android:orientation="vertical">
<com.scwang.smartrefresh.layout.SmartRefreshLayout <ScrollView
android:id="@+id/refreshLayout" android:id="@+id/refreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginHorizontal="@dimen/dp_16" android:layout_marginHorizontal="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_10" android:layout_marginTop="@dimen/dp_10"
android:layout_weight="1" android:layout_weight="1"
app:srlEnableLoadMore="false" >
app:srlEnableRefresh="false">
<!-- 使用 LinearLayout 作为 SmartRefreshLayout 的唯一子布局 --> <!-- 使用 LinearLayout 作为 SmartRefreshLayout 的唯一子布局 -->
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -26,6 +25,7 @@
android:orientation="vertical"> android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_zu"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/bg_r12_c5ffc9_f9e9ff_c7ecfa"> android:background="@drawable/bg_r12_c5ffc9_f9e9ff_c7ecfa">
@@ -155,6 +155,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<TextView <TextView
android:id="@+id/tv_me_jz"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
@@ -178,7 +179,7 @@
app:spanCount="1" app:spanCount="1"
tools:listitem="@layout/item_family_members" /> tools:listitem="@layout/item_family_members" />
</LinearLayout> </LinearLayout>
</com.scwang.smartrefresh.layout.SmartRefreshLayout> </ScrollView>
</LinearLayout> </LinearLayout>
</layout> </layout>

View File

@@ -10,15 +10,14 @@
android:orientation="vertical"> android:orientation="vertical">
<com.scwang.smartrefresh.layout.SmartRefreshLayout <ScrollView
android:id="@+id/refreshLayout" android:id="@+id/refreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginHorizontal="@dimen/dp_16" android:layout_marginHorizontal="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_10" android:layout_marginTop="@dimen/dp_10"
android:layout_weight="1" android:layout_weight="1"
app:srlEnableLoadMore="false" >
app:srlEnableRefresh="false">
<!-- 使用 LinearLayout 作为 SmartRefreshLayout 的唯一子布局 --> <!-- 使用 LinearLayout 作为 SmartRefreshLayout 的唯一子布局 -->
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -178,6 +177,6 @@
app:spanCount="1" app:spanCount="1"
tools:listitem="@layout/item_family_members" /> tools:listitem="@layout/item_family_members" />
</LinearLayout> </LinearLayout>
</com.scwang.smartrefresh.layout.SmartRefreshLayout> </ScrollView>
</LinearLayout> </LinearLayout>
</layout> </layout>

View File

@@ -436,7 +436,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@mipmap/icon_dialog_u_cp_left_top" android:background="@mipmap/icon_dialog_u_cp_left_top"
android:gravity="center" android:gravity="center"
android:text="CP" android:text="心动"
android:textColor="@color/white" /> android:textColor="@color/white" />
<LinearLayout <LinearLayout

View File

@@ -54,6 +54,14 @@
android:gravity="center" android:gravity="center"
android:textColor="@color/color_FF333333" android:textColor="@color/color_FF333333"
android:textSize="@dimen/sp_15" /> android:textSize="@dimen/sp_15" />
<ImageView
android:id="@+id/iv_gift"
android:layout_width="@dimen/dp_21"
android:layout_height="@dimen/dp_21"
android:layout_marginStart="@dimen/dp_2"
tools:src="@mipmap/arrow_right"
android:scaleType="fitCenter"/>
</LinearLayout> </LinearLayout>
<TextView <TextView
@@ -64,7 +72,7 @@
android:layout_marginStart="@dimen/dp_8" android:layout_marginStart="@dimen/dp_8"
android:drawableLeft="@mipmap/jinb" android:drawableLeft="@mipmap/jinb"
android:gravity="end|center_vertical" android:gravity="end|center_vertical"
android:textColor="@color/color_FF666666" android:textColor="@color/red"
android:textSize="@dimen/sp_12" android:textSize="@dimen/sp_12"
tools:text="价值" /> tools:text="价值" />