app/src/main/java/com/example/firstapp/activity/LoginActivity.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/activity/SettingActivity.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/adapter/InvitationRecord2Adapter.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/res/drawable/bg_invitation_record.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/res/layout/activity_invitation_main.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/res/layout/item_invitation_record.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/res/values/styles.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
app/src/main/java/com/example/firstapp/activity/LoginActivity.kt
@@ -15,17 +15,30 @@ 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) // 这里查看是否已经登录过,如果已经登录过则直接跳转到主页 // 获取token val token = PreferencesManager.getToken() if (!token.isNullOrEmpty()) { startActivity(Intent(this, MainActivity::class.java)) finishAffinity() // 结束所有之前的Activity }else{ setContentView(binding.root) setupViews() @@ -36,6 +49,10 @@ } } } private fun setupViews() { binding.btnStartLogin.setOnClickListener { if (binding.cbAgreement.isChecked) { 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) 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 } 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( app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt
@@ -379,6 +379,8 @@ // 只清除内存中的数据 _categories.value = emptyList() categoriesLoaded = false // 删除token PreferencesManager.clearUserData() } } 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") 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> 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> </androidx.cardview.widget.CardView>--> <!-- 添加一个权重为1的View,用于填充剩余空间 --> <View 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> 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>