From 784a67214d4b1082d268836775eb3cb7121b3925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=B0=8F=E6=B1=9F?= <461355754@qq.com> Date: Fri, 28 Nov 2025 14:38:03 +0800 Subject: [PATCH] =?UTF-8?q?1:=E5=AE=8C=E6=88=90=E6=89=8D=E8=89=BA=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xscm/moduleutil/http/ApiServer.java | 2 + .../xscm/moduleutil/http/RetrofitClient.java | 55 ++++++--- .../com/xscm/moduleutil/widget/Constants.java | 1 + .../activity/room/activity/RoomActivity.kt | 6 + .../modulemain/adapter/RoomTalentAdapter.kt | 106 ++++++++++++++++++ .../modulemain/dialog/RoomTalentDialog.kt | 101 +++++++++++++++++ .../src/main/res/drawable/bg_item_normal.xml | 9 ++ .../main/res/drawable/bg_item_selected.xml | 18 +++ .../main/res/layout/dialog_room_talent.xml | 82 ++++++++++++++ .../src/main/res/layout/item_room_talent.xml | 21 ++++ 10 files changed, 387 insertions(+), 14 deletions(-) create mode 100644 MainModule/src/main/java/com/xscm/modulemain/adapter/RoomTalentAdapter.kt create mode 100644 MainModule/src/main/java/com/xscm/modulemain/dialog/RoomTalentDialog.kt create mode 100644 MainModule/src/main/res/drawable/bg_item_normal.xml create mode 100644 MainModule/src/main/res/drawable/bg_item_selected.xml create mode 100644 MainModule/src/main/res/layout/dialog_room_talent.xml create mode 100644 MainModule/src/main/res/layout/item_room_talent.xml diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java index 455c10f5..a593e416 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -870,4 +870,6 @@ public interface ApiServer { @POST(Constants.POST_FAMILY_EARNINGS) Call>> familyEarnings( @Field("user_id") String user_id,@Field("page") int page,@Field("start_time") String start_time,@Field("end_time") String end_time); + @GET(Constants.GET_SKILL_LIST) + Call>> skillList(); } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java index f356f956..e4dc5ba5 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -520,8 +520,8 @@ public class RetrofitClient { }); } - public void postInvite(String apply_id,String type,BaseObserver observer) { - sApiServer.postInvite(apply_id,type).enqueue(new Callback>() { + public void postInvite(String apply_id, String type, BaseObserver observer) { + sApiServer.postInvite(apply_id, type).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { @@ -543,7 +543,7 @@ public class RetrofitClient { @Override public void onFailure(Call> call, Throwable t) { - LogUtils.e("修改公会公告失败",t.fillInStackTrace()); + LogUtils.e("修改公会公告失败", t.fillInStackTrace()); } }); } @@ -3099,7 +3099,7 @@ public class RetrofitClient { if (response.code() == 200) { BaseModel data = response.body(); if (data.getCode() == 1) { - if (data.getData()!=null) { + if (data.getData() != null) { if (data.getData().getCp_type() != null) { if (cpListener != null) { cpListener.onSendCpMsg(data.getData()); @@ -3107,7 +3107,7 @@ public class RetrofitClient { } observer.onNext(data.getData());//2025年11月25日09:10:54,服务端修改,应该是都不能等于null - }else { + } else { observer.onNext(new RoomGiftData());//这里添加这个,是预防报错 } } else if (data.getCode() == 0) { @@ -4559,7 +4559,7 @@ public class RetrofitClient { } - public void getCpRoom(String userId,BaseObserver observer) { + public void getCpRoom(String userId, BaseObserver observer) { sApiServer.getCpRoom(userId).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { @@ -4581,8 +4581,8 @@ public class RetrofitClient { }); } - public void myFamily(int type,BaseObserver observer) { - if (type==1) { + public void myFamily(int type, BaseObserver observer) { + if (type == 1) { sApiServer.myFamily().enqueue(new Callback>() { @Override @@ -4590,7 +4590,7 @@ public class RetrofitClient { if (response.code() == 200) { BaseModel baseModel = response.body(); if (baseModel.getCode() == 1) { - observer.onNext(baseModel.getData()!=null ? baseModel.getData() : new MyFamilyBean()); + observer.onNext(baseModel.getData() != null ? baseModel.getData() : new MyFamilyBean()); } else if (baseModel.getCode() == 301) { try { ToastUtils.showShort(baseModel.getMsg()); @@ -4608,7 +4608,7 @@ public class RetrofitClient { LogUtils.e("myFamily", t.fillInStackTrace()); } }); - }else { + } else { sApiServer.myJoinFamily().enqueue(new Callback>() { @Override @@ -4616,7 +4616,7 @@ public class RetrofitClient { if (response.code() == 200) { BaseModel baseModel = response.body(); if (baseModel.getCode() == 1) { - observer.onNext(baseModel.getData()!=null ? baseModel.getData() : new MyFamilyBean()); + observer.onNext(baseModel.getData() != null ? baseModel.getData() : new MyFamilyBean()); } else if (baseModel.getCode() == 301) { try { ToastUtils.showShort(baseModel.getMsg()); @@ -4638,14 +4638,14 @@ public class RetrofitClient { } } - public void familyEarnings(String user_id,int page,String start_time,String end_time,BaseObserver> observer) { - sApiServer.familyEarnings(user_id,page,start_time,end_time).enqueue(new Callback>>() { + public void familyEarnings(String user_id, int page, String start_time, String end_time, BaseObserver> observer) { + sApiServer.familyEarnings(user_id, page, start_time, end_time).enqueue(new Callback>>() { @Override public void onResponse(Call>> call, Response>> response) { if (response.code() == 200) { BaseModel> baseModel = response.body(); if (baseModel.getCode() == 1) { - observer.onNext(baseModel.getData()!=null?baseModel.getData():new ArrayList()); + observer.onNext(baseModel.getData() != null ? baseModel.getData() : new ArrayList()); } else if (baseModel.getCode() == 301) { try { ToastUtils.showShort(baseModel.getMsg()); @@ -4666,5 +4666,32 @@ public class RetrofitClient { } + public void skillList(BaseObserver> observer) { + sApiServer.skillList().enqueue(new Callback>>() { + @Override + public void onResponse(Call>> call, Response>> response) { + if (response.code() == 200) { + BaseModel> baseModel = response.body(); + if (baseModel.getCode() == 1) + observer.onNext(baseModel.getData() != null ? baseModel.getData() : new ArrayList()); + else if (baseModel.getCode() == 301) { + try { + ToastUtils.showShort(baseModel.getMsg()); + CommonAppContext.getInstance().clearLoginInfo(); + } catch (ClassNotFoundException e) { + } + + } else { + ToastUtils.showLong(baseModel.getMsg()); + } + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + LogUtils.e("skillList", t.fillInStackTrace()); + } + }); + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java index f58a14ed..93b31371 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -430,6 +430,7 @@ public class Constants { public static final String POST_FRIEND_LIST = "/api/User/get_friend_list";//挚友列表 public static final String POST_FRIEND_LIST_MORE = "/api/User/get_friend_list_more";//挚友列表查看更多 public static final String POST_SEND_LOG = "api/Report/android_log_report";//上传log信息 + public static final String GET_SKILL_LIST = "/api/Sign/skill_list";//才艺列表 diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt index cdab4b0c..31e44377 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt @@ -3116,6 +3116,12 @@ class RoomActivity : BaseMvpActivity(), } + fun dialogMessage(event: RoomInputEvent){ + if (publicScreenFragment != null) { + publicScreenFragment!!.fasong(event) + } + } + private fun countDownTimer() { releaseCountDownTimer() mCountDownTimer = object : CountDownTimer(3 * 1000L, 1000L) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/RoomTalentAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/RoomTalentAdapter.kt new file mode 100644 index 00000000..d7a0919d --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/RoomTalentAdapter.kt @@ -0,0 +1,106 @@ +package com.xscm.modulemain.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.compose.ui.graphics.Color +import androidx.recyclerview.widget.RecyclerView +import com.xscm.modulemain.R + +/** +* 项目名称:羽声语音 +* 时间:2025/11/28 10:39 +* 用途:房间人才列表适配器,支持单选功能 +*/ +class RoomTalentAdapter( + private val dataList: List, + private val onItemSelectedListener: (String, Int) -> Unit +) : RecyclerView.Adapter() { + + private var selectedPosition = -1 // 默认没有选中项 + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_room_talent, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = dataList[position] + holder.bind(item, position) + } + + override fun getItemCount(): Int = dataList.size + + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val textView: TextView = itemView.findViewById(R.id.tv_talent) + + fun bind(item: String, position: Int) { + textView.text = item + + // 设置选中状态 + if (position == selectedPosition) { + textView.setBackgroundResource(R.drawable.bg_item_selected) // 选中背景 + textView.setTextColor(android.graphics.Color.parseColor("#3ABC6D")) + } else { + textView.setBackgroundResource(R.drawable.bg_item_normal) // 默认背景 + textView.setTextColor(android.graphics.Color.parseColor("#333333")) + + } + + // 设置点击事件 + itemView.setOnClickListener { + // 如果点击的是已选中的项,不做处理 + if (position == selectedPosition) return@setOnClickListener + + // 更新选中位置 + val previousPosition = selectedPosition + selectedPosition = position + + // 通知之前选中的项更新背景 + if (previousPosition != -1) { + notifyItemChanged(previousPosition) + } + + // 通知当前选中的项更新背景 + notifyItemChanged(position) + + // 回调选中的值和位置 + onItemSelectedListener(item, position) + } + } + } + + /** + * 设置选中的位置 + */ + fun setSelectedPosition(position: Int) { + if (position in 0 until itemCount && position != selectedPosition) { + val previousPosition = selectedPosition + selectedPosition = position + + if (previousPosition != -1) { + notifyItemChanged(previousPosition) + } + + notifyItemChanged(position) + } + } + + /** + * 获取当前选中的位置 + */ + fun getSelectedPosition(): Int = selectedPosition + + /** + * 获取当前选中的值 + */ + fun getSelectedValue(): String? { + return if (selectedPosition in 0 until itemCount) { + dataList[selectedPosition] + } else { + null + } + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomTalentDialog.kt b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomTalentDialog.kt new file mode 100644 index 00000000..65d930b0 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomTalentDialog.kt @@ -0,0 +1,101 @@ +package com.xscm.modulemain.dialog + +import android.content.Context +import android.view.Gravity +import android.view.ViewGroup +import com.blankj.utilcode.util.ActivityUtils +import com.blankj.utilcode.util.GsonUtils +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.ScreenUtils +import com.hjq.toast.ToastUtils +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.room.activity.RoomActivity +import com.xscm.modulemain.adapter.RoomTalentAdapter +import com.xscm.modulemain.databinding.DialogRoomTalentBinding +import com.xscm.moduleutil.bean.RoomInputEvent +import com.xscm.moduleutil.bean.RoomMessageEvent +import com.xscm.moduleutil.bean.RoomMessageEvent.T +import com.xscm.moduleutil.http.BaseObserver +import com.xscm.moduleutil.http.RetrofitClient +import com.xscm.moduleutil.listener.MessageListenerSingleton +import com.xscm.moduleutil.utils.SpUtil +import com.xscm.moduleutil.widget.dialog.BaseDialog +import com.xscm.moduleutil.widget.floatingView.IFloatingView +import io.reactivex.disposables.Disposable +import java.nio.charset.StandardCharsets + +/** + * 项目名称:羽声语音 + * 时间:2025/11/28 9:25 + * 用途:签约房中的展示才艺 + */ +class RoomTalentDialog(context: Context, val roomId: String) : + BaseDialog(context, com.xscm.moduleutil.R.style.BaseDialogStyleH) { + + var adapter: RoomTalentAdapter? = null + + override fun getLayoutId(): Int { + return R.layout.dialog_room_talent + } + + override fun initView() { + setupWindow() + mBinding.tvQx.setOnClickListener { + dismiss() + } + mBinding.tvQd.setOnClickListener { + if (adapter?.getSelectedValue()?.isEmpty() == true) { + ToastUtils.show("请选择才艺") + } else { + var messageEvent = + RoomInputEvent(SpUtil.getUserInfo().nickname + "选择了" + adapter?.getSelectedValue() + "才艺") + (ActivityUtils.getTopActivity() as? RoomActivity)?.let { roomActivity -> + roomActivity.dialogMessage(messageEvent) + } + } + dismiss() + } + } + + + override fun initData() { + RetrofitClient.getInstance().skillList(object : BaseObserver>() { + override fun onSubscribe(d: Disposable) { + } + + override fun onNext(t: MutableList) { + if (t.isNotEmpty()) { + + t.addAll(t) + t.addAll(t) + t.addAll(t) + adapter = RoomTalentAdapter(t) { selectedValue, position -> + // 处理选中事件 + LogUtils.e("选中了: $selectedValue, 位置: $position") + } + + // 设置GridLayoutManager,每行显示4个item + val layoutManager = + androidx.recyclerview.widget.GridLayoutManager(context, 4) + mBinding.recycleView.layoutManager = layoutManager + mBinding.recycleView.adapter = adapter + } + } + + }) + } + + private fun setupWindow() { + val window = window ?: return + window.setGravity(Gravity.BOTTOM) + window.setLayout( + ViewGroup.LayoutParams.MATCH_PARENT, + (ScreenUtils.getAppScreenHeight() * 348f / 812).toInt() + ) + window.setBackgroundDrawableResource(android.R.color.transparent) + + val params = window.attributes + params.windowAnimations = com.xscm.moduleutil.R.style.BaseDialogStyleH + window.attributes = params + } +} \ No newline at end of file diff --git a/MainModule/src/main/res/drawable/bg_item_normal.xml b/MainModule/src/main/res/drawable/bg_item_normal.xml new file mode 100644 index 00000000..d43a5594 --- /dev/null +++ b/MainModule/src/main/res/drawable/bg_item_normal.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/drawable/bg_item_selected.xml b/MainModule/src/main/res/drawable/bg_item_selected.xml new file mode 100644 index 00000000..060369f7 --- /dev/null +++ b/MainModule/src/main/res/drawable/bg_item_selected.xml @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/MainModule/src/main/res/layout/dialog_room_talent.xml b/MainModule/src/main/res/layout/dialog_room_talent.xml new file mode 100644 index 00000000..4f757e83 --- /dev/null +++ b/MainModule/src/main/res/layout/dialog_room_talent.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_room_talent.xml b/MainModule/src/main/res/layout/item_room_talent.xml new file mode 100644 index 00000000..ebe3a0f6 --- /dev/null +++ b/MainModule/src/main/res/layout/item_room_talent.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file