From 0cf0870889d65f5d11d0b2c8af7bca9442a7ba19 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期一, 21 四月 2025 17:14:50 +0800 Subject: [PATCH] Merge branch 'master' of http://47.96.225.205:8888/r/FirstApp2 --- app/src/main/java/com/example/firstapp/activity/SettingActivity.kt | 4 app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt | 4 app/src/main/res/values/styles.xml | 5 + app/src/main/res/layout/activity_invitation_main.xml | 70 ++++++++++--- app/src/main/res/layout/item_invitation_record.xml | 35 +++++++ app/src/main/java/com/example/firstapp/activity/LoginActivity.kt | 29 ++++- app/src/main/java/com/example/firstapp/adapter/InvitationRecord2Adapter.kt | 49 +++++++++ app/src/main/res/drawable/bg_invitation_record.xml | 5 + app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt | 2 app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt | 49 ++++++++- 10 files changed, 220 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt b/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt index fcb8a6b..6bde03a 100644 --- a/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt +++ b/app/src/main/java/com/example/firstapp/activity/LoginActivity.kt @@ -15,25 +15,42 @@ import android.widget.Button import android.widget.CheckBox import android.widget.TextView +import androidx.activity.viewModels +import com.example.firstapp.MainActivity import com.example.firstapp.R import com.example.firstapp.databinding.ActivityLoginBinding +import com.example.firstapp.ui.login.LoginViewModel import com.example.firstapp.utils.PreferencesManager import kotlin.system.exitProcess class LoginActivity : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding + private val viewModel: LoginViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityLoginBinding.inflate(layoutInflater) - setContentView(binding.root) - setupViews() - val phone=PreferencesManager.getLastLoginPhone() - // 如果phone不存在则展示弹框 - if (phone.isNullOrEmpty()) { - showConfirmDialog() + // 这里查看是否已经登录过,如果已经登录过则直接跳转到主页 + // 获取token + val token = PreferencesManager.getToken() + if (!token.isNullOrEmpty()) { + startActivity(Intent(this, MainActivity::class.java)) + finishAffinity() // 结束所有之前的Activity + }else{ + setContentView(binding.root) + setupViews() + + val phone=PreferencesManager.getLastLoginPhone() + // 如果phone不存在则展示弹框 + if (phone.isNullOrEmpty()) { + showConfirmDialog() + } } + + + } private fun setupViews() { diff --git a/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt index 1d2bca2..4741173 100644 --- a/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt +++ b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt @@ -168,6 +168,7 @@ lifecycleScope.launch { try { // 清除本地的数据库 + RetrofitClient.apiService.closeAccount() Core.code.deleteAll() @@ -175,6 +176,9 @@ Core.keyword.deleteAll() // Core.reminder.deleteAll() + // 清楚登录相关信息 + homeViewModel.logout() + dialog.dismiss() // 跳转到 LoginActivity 并清除之前的任务栈 var intent = Intent(this@SettingActivity, LoginActivity::class.java) diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationRecord2Adapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationRecord2Adapter.kt new file mode 100644 index 0000000..57131c2 --- /dev/null +++ b/app/src/main/java/com/example/firstapp/adapter/InvitationRecord2Adapter.kt @@ -0,0 +1,49 @@ +package com.example.firstapp.adapter + +import android.content.Context +import android.text.TextUtils +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.example.firstapp.R +import com.example.firstapp.entity.InvitationRecord +import com.google.android.material.imageview.ShapeableImageView + + +class InvitationRecord2Adapter( + private val records: List<InvitationRecord> +) : RecyclerView.Adapter<InvitationRecord2Adapter.RecordViewHolder>() { + + + + class RecordViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val avatarImageView: ShapeableImageView = itemView.findViewById(R.id.avatarImageView) + val nameTextView: TextView = itemView.findViewById(R.id.nameTextView) + val statusTextView: TextView = itemView.findViewById(R.id.statusTextView) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecordViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_invitation_record, parent, false) + return RecordViewHolder(view) + } + + override fun onBindViewHolder(holder: RecordViewHolder, position: Int) { + val record = records[position] + + // 加载网络图片 + Glide.with(holder.itemView.context) + .load(record.cover) // 网络图片 URL + .placeholder(R.drawable.default_avatar) // 加载中占位图 + .error(R.drawable.default_avatar) // 加载失败时显示的图片 + .into(holder.avatarImageView) + + holder.nameTextView.text = record.userName + holder.statusTextView.text = record.status + } + + override fun getItemCount(): Int = records.size +} diff --git a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt index eb514c9..8091ac5 100644 --- a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt +++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt @@ -4,7 +4,9 @@ val userId: String, val userName: String, val reward: String, - val status: String + val status: String, + val cover:String, + ) data class InvitationRecords( diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt index e1357b3..1507d6e 100644 --- a/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt @@ -379,6 +379,8 @@ // 只清除内存中的数据 _categories.value = emptyList() categoriesLoaded = false + // 删除token + PreferencesManager.clearUserData() } } \ No newline at end of file diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt index efb0e6c..9fb0021 100644 --- a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt +++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt @@ -19,6 +19,7 @@ import android.view.ViewGroup import android.widget.Button import android.widget.ImageView +import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -31,6 +32,7 @@ import com.example.firstapp.App.Companion.context import com.example.firstapp.R import com.example.firstapp.adapter.InvitationAdapter +import com.example.firstapp.adapter.InvitationRecord2Adapter import com.example.firstapp.adapter.InvitationRecordAdapter import com.example.firstapp.database.request.SmsLoginRequest import com.example.firstapp.database.service.RetrofitClient @@ -49,7 +51,7 @@ private lateinit var recyclerSuccessView: RecyclerView private lateinit var recyclerRecordView: RecyclerView private lateinit var adapter: InvitationAdapter - private lateinit var recordadapter: InvitationRecordAdapter +// private lateinit var recordadapter: InvitationRecordAdapter private var data = mutableListOf<InvitationRecord>() private var recorddata = mutableListOf<InvitationRecord>() private val handler = Handler(Looper.getMainLooper()) @@ -57,6 +59,11 @@ private var currentScrollPosition = 0 private var currentRecordScrollPosition = 0 private var itemHeight = 0 // 动态存储item高度 + + private lateinit var invitedRecordRecyclerView2: RecyclerView + private lateinit var invitationAdapter: InvitationRecord2Adapter + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -68,7 +75,7 @@ //初始化Adapter initSuccessAdapter() - initRecorddapter() +// initRecorddapter() //加载数据 getInvitereward() @@ -94,6 +101,8 @@ clipboard.setPrimaryClip(clip) Toast.makeText(this, "已复制邀请码", Toast.LENGTH_SHORT).show() } + + } @@ -142,8 +151,8 @@ } } // 记录列表 - recyclerRecordView = findViewById(R.id.invitationrecordRecyclerView) - recyclerRecordView.layoutManager = LinearLayoutManager(this) +// recyclerRecordView = findViewById(R.id.invitationrecordRecyclerView) +// recyclerRecordView.layoutManager = LinearLayoutManager(this) } private fun initSuccessAdapter() { @@ -162,10 +171,25 @@ recyclerSuccessView.adapter = adapter } - private fun initRecorddapter() { - recordadapter = InvitationRecordAdapter(this, recorddata) - recyclerRecordView.adapter = recordadapter - } +// private fun initRecorddapter() { +// recordadapter = InvitationRecordAdapter(this, recorddata) +// recyclerRecordView.adapter = recordadapter +// } +// private fun initRecorddapter() { +// recordadapter = InvitationRecordAdapter(this, recorddata).apply { +// registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { +// override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { +// // 数据插入时检查高度 +// recyclerRecordView.post { +// if (recyclerRecordView.childCount > 0) { +// itemHeight = recyclerRecordView.getChildAt(0).height +// } +// } +// } +// }) +// } +// recyclerRecordView.adapter = recordadapter +// } private fun getInvitereward() { lifecycleScope.launch { @@ -184,10 +208,17 @@ addAll(records.myInvite ?: emptyList()) // 注意这里使用myInvite } + // 加载适配器 + invitedRecordRecyclerView2 = findViewById(R.id.invited_record_recycler_view_2) + invitedRecordRecyclerView2.layoutManager = LinearLayoutManager(this@InvitationActivity) + invitationAdapter = InvitationRecord2Adapter(records.myInvite) + invitedRecordRecyclerView2.adapter = invitationAdapter + + // 在UI线程更新适配器 withContext(Dispatchers.Main) { adapter.notifyDataSetChanged() - recordadapter.notifyDataSetChanged() +// recordadapter.notifyDataSetChanged() } } ?: run { Log.w("API", "Response data is null") diff --git a/app/src/main/res/drawable/bg_invitation_record.xml b/app/src/main/res/drawable/bg_invitation_record.xml new file mode 100644 index 0000000..4d71872 --- /dev/null +++ b/app/src/main/res/drawable/bg_invitation_record.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="#FFFFFF" /> <!-- 背景白色 --> + <corners android:radius="12dp" /> <!-- 圆角半径 --> +</shape> diff --git a/app/src/main/res/layout/activity_invitation_main.xml b/app/src/main/res/layout/activity_invitation_main.xml index 2859f8b..120d1f0 100644 --- a/app/src/main/res/layout/activity_invitation_main.xml +++ b/app/src/main/res/layout/activity_invitation_main.xml @@ -39,15 +39,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:padding="16dp" + android:padding="10dp" android:textColor="#FFFFFF" android:textSize="15sp" /> <!-- 横幅广告区域 --> <androidx.cardview.widget.CardView android:layout_width="match_parent" - android:layout_height="160dp" - android:layout_marginBottom="16dp" + android:layout_height="140dp" + android:layout_marginBottom="10dp" app:cardCornerRadius="13dp" app:cardPreventCornerOverlap="true"> @@ -62,13 +62,13 @@ <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="20dp" + android:layout_marginBottom="10dp" app:cardCornerRadius="38dp"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/invitationsuccessRecyclerView" android:layout_width="match_parent" - android:layout_height="60dp" + android:layout_height="40dp" android:nestedScrollingEnabled="false" android:overScrollMode="never" /> </androidx.cardview.widget.CardView> @@ -82,7 +82,7 @@ android:backgroundTint="#FF0000" android:insetTop="0dp" android:insetBottom="0dp" - android:padding="12dp" + android:padding="10dp" android:text="立即邀请好友" android:textColor="#FFFFFF" android:textSize="16sp" @@ -288,13 +288,14 @@ </LinearLayout> </androidx.cardview.widget.CardView> - <!-- 邀请记录区域 --> - <androidx.cardview.widget.CardView + + <LinearLayout + android:id="@+id/invitationrecordLinearLayout" android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginBottom="20dp" - app:cardCornerRadius="6dp" - app:cardPreventCornerOverlap="true"> + android:layout_height="wrap_content" + android:orientation="vertical" + android:background="@drawable/bg_invitation_record" + android:padding="10dp"> <LinearLayout android:layout_width="match_parent" @@ -305,13 +306,45 @@ <TextView android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="center" + android:paddingLeft="16dp" + android:paddingBottom="5dp" + android:text="我的邀请记录" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + </LinearLayout> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/invited_record_recycler_view_2" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + </LinearLayout> + + <!-- 邀请记录区域 --> + <!-- <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:cardCornerRadius="6dp" + > + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <!– 添加"我的邀请记录"标题 –> + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" android:paddingLeft="16dp" android:paddingBottom="8dp" android:text="我的邀请记录" android:textColor="#333333" android:textSize="16sp" - android:textStyle="bold" - android:gravity="center" /> + android:textStyle="bold" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/invitationrecordRecyclerView" @@ -319,8 +352,13 @@ android:layout_height="wrap_content" android:nestedScrollingEnabled="false" android:overScrollMode="never" /> - </LinearLayout> - </androidx.cardview.widget.CardView> + + </LinearLayout> + + + </androidx.cardview.widget.CardView>--> + + <!-- 添加一个权重为1的View,用于填充剩余空间 --> <View diff --git a/app/src/main/res/layout/item_invitation_record.xml b/app/src/main/res/layout/item_invitation_record.xml new file mode 100644 index 0000000..1ab26b5 --- /dev/null +++ b/app/src/main/res/layout/item_invitation_record.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="horizontal" + android:padding="8dp"> + + <com.google.android.material.imageview.ShapeableImageView + android:id="@+id/avatarImageView" + android:layout_width="30dp" + android:layout_height="30dp" + android:layout_marginLeft="10dp" + android:scaleType="centerCrop" + + app:shapeAppearance="@style/CircleImage" + /> + + <TextView + android:id="@+id/nameTextView" + android:layout_width="wrap_content" + android:layout_height="30dp" + android:layout_marginLeft="10dp" + android:gravity="center_vertical" + android:minWidth="100dp" + android:text="Name" /> + + <TextView + android:id="@+id/statusTextView" + android:layout_width="wrap_content" + android:layout_height="30dp" + android:layout_marginLeft="50dp" + android:gravity="center_vertical" + android:text="Status" /> +</LinearLayout> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 7611b17..d72ae95 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -63,4 +63,9 @@ <item name="android:textColor">#000000</item> <!-- 设置标题颜色 --> </style> + <style name="CircleImage"> + <item name="cornerFamily">rounded</item> + <item name="cornerSize">50%</item> + </style> + </resources> -- Gitblit v1.9.3