From db2e408f6c2eddc363ed76e0f5fd1e59a02aa175 Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期四, 03 四月 2025 09:12:37 +0800
Subject: [PATCH] 邀请有礼

---
 app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt                |    3 
 app/src/main/res/drawable/table_border.xml                                       |    7 
 app/src/main/res/values/strings.xml                                              |    3 
 app/src/main/res/layout/activity_invitation_main.xml                             |  446 ++++++++++++++-------------
 app/src/main/res/layout/activity_invitation_success.xml                          |   24 
 app/src/main/res/layout/activity_invitation_record.xml                           |   35 ++
 app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt        |   39 ++
 app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt       |  334 +++++++++++++++++---
 app/src/main/res/drawable/cell_border.xml                                        |   15 
 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt |    6 
 app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt              |   33 +-
 app/build.gradle                                                                 |    4 
 app/src/main/res/drawable/bg_gradient.xml                                        |    8 
 13 files changed, 658 insertions(+), 299 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 3257afb..88aea3e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -285,5 +285,9 @@
 
     implementation 'com.google.android.material:material:1.4.0'
 
+    implementation 'de.hdodenhof:circleimageview:3.1.0'
+
+    implementation 'com.github.castorflex:SmoothProgressBar:1.1.0'
+
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
index b045175..02c3744 100644
--- a/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
+++ b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
@@ -1,5 +1,7 @@
 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
@@ -7,30 +9,29 @@
 import androidx.recyclerview.widget.RecyclerView
 import com.example.firstapp.R
 import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.utils.Log
 
-class InvitationAdapter : RecyclerView.Adapter<InvitationAdapter.ViewHolder>() {
 
-    private var records = emptyList<InvitationRecord>()
+class InvitationAdapter(
+    private val context: Context,
+    private val data: List<InvitationRecord>,
+) : RecyclerView.Adapter<InvitationAdapter.InvitationViewHolder>() {
 
-    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val message: TextView = itemView.findViewById(R.id.message)
-    }
-
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
-        val view = LayoutInflater.from(parent.context)
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InvitationViewHolder {
+        val view = LayoutInflater.from(context)
             .inflate(R.layout.activity_invitation_success, parent, false)
-        return ViewHolder(view)
-    }
 
-    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
-        val record = records[position]
+        return InvitationViewHolder(view)
+    }
+    override fun onBindViewHolder(holder: InvitationViewHolder, position: Int) {
+        val record = data[position % data.size] // 使用取模实现循环
         holder.message.text = "${record.userName}邀请好友,${record.reward}"
+
     }
 
-    override fun getItemCount() = records.size
+    override fun getItemCount() = if (data.isEmpty()) 0 else Int.MAX_VALUE
 
-    fun submitList(newList: List<InvitationRecord>) {
-        records = newList
-        notifyDataSetChanged()
+    class InvitationViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val message: TextView = itemView.findViewById(R.id.message)
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt
new file mode 100644
index 0000000..1d8e5f1
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt
@@ -0,0 +1,39 @@
+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.example.firstapp.R
+import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.utils.Log
+
+
+class InvitationRecordAdapter(
+    private val context: Context,
+    private val data: List<InvitationRecord>,
+) : RecyclerView.Adapter<InvitationRecordAdapter.InvitationRecordViewHolder>() {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InvitationRecordViewHolder {
+        val view = LayoutInflater.from(context)
+            .inflate(R.layout.activity_invitation_record, parent, false)
+
+        return InvitationRecordViewHolder(view)
+    }
+    override fun onBindViewHolder(holder: InvitationRecordViewHolder, position: Int) {
+        val record = data[position % data.size] // 使用取模实现循环
+        holder.recordmessage.text = "${record.userName}"
+        holder.recordstatus.text = "${record.status}"
+
+    }
+
+    override fun getItemCount() = if (data.isEmpty()) 0 else Int.MAX_VALUE
+
+    class InvitationRecordViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val recordmessage: TextView = itemView.findViewById(R.id.recordmessage)
+        val recordstatus: TextView = itemView.findViewById(R.id.recordstatus)
+    }
+}
\ No newline at end of file
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 938bac5..d131854 100644
--- a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
+++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
@@ -2,5 +2,6 @@
 
 data class InvitationRecord(
     val userName: String,
-    val reward: String
+    val reward: String,
+    val status: String
 )
\ 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 51fc5fc..55d957f 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
@@ -1,98 +1,318 @@
 package com.example.firstapp.ui.invitation
 
+import android.content.Context
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
-import android.util.DisplayMetrics
+import android.text.Html
+import android.util.TypedValue
+import android.view.View
+import android.widget.TextView
 import androidx.appcompat.app.AppCompatActivity
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearSmoothScroller
 import androidx.recyclerview.widget.RecyclerView
 import com.example.firstapp.R
 import com.example.firstapp.adapter.InvitationAdapter
+import com.example.firstapp.adapter.InvitationRecordAdapter
 import com.example.firstapp.entity.InvitationRecord
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.Executors
+import kotlin.math.abs
 
 class InvitationActivity : AppCompatActivity() {
 
-    private lateinit var recyclerView: RecyclerView
+    private lateinit var recyclerSuccessView: RecyclerView
+    private lateinit var recyclerRecordView: RecyclerView
     private lateinit var adapter: InvitationAdapter
-    private var currentPosition = 0
+    private lateinit var recordadapter: InvitationRecordAdapter
+    private val data = mutableListOf<InvitationRecord>()
+    private val recorddata = mutableListOf<InvitationRecord>()
     private val handler = Handler(Looper.getMainLooper())
-    private lateinit var scrollRunnable: Runnable
+    private val scrollInterval = 3000L
+    private var currentScrollPosition = 0
+    private var currentRecordScrollPosition = 0
+    private var itemHeight = 0 // 动态存储item高度
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_invitation_main)
 
-        setupRecyclerView()
+        // 初始化视图
+        initViews()
+
+        //初始化Adapter
+        initSuccessAdapter()
+
+        initRecorddapter()
+
+        //加载数据
         loadData()
-        setupAutoScroll()
-    }
 
-    private fun setupRecyclerView() {
-        recyclerView = findViewById(R.id.invitationsuccessRecyclerView)
-        recyclerView.layoutManager = LinearLayoutManager(this).apply {
-            stackFromEnd = false // 从顶部开始布局
-        }
-        adapter = InvitationAdapter()
-        recyclerView.adapter = adapter
-    }
+        loadRecordData()
 
-    private fun loadData() {
-        val mockData = listOf(
-            InvitationRecord("H****e", "获得了3天会员"),
-            InvitationRecord("U****r", "获得了7天会员"),
-            InvitationRecord("A****e", "获得了免广告特权"),
-            InvitationRecord("B****d", "获得了3天会员"),
-            InvitationRecord("C****o", "获得了7天会员")
-        )
-        adapter.submitList(mockData)
-    }
-
-    private fun setupAutoScroll() {
-        scrollRunnable = object : Runnable {
-            override fun run() {
-                if (currentPosition < adapter.itemCount - 1) {
-                    currentPosition++
-                    smoothScrollToPosition(currentPosition)
-                } else {
-                    // 滚动到底部后回到顶部
-                    currentPosition = 0
-                    recyclerView.scrollToPosition(0)
-                }
-                handler.postDelayed(this, 2000)
-            }
-        }
+        //启动轮播
         startAutoScroll()
     }
 
-    private fun smoothScrollToPosition(position: Int) {
-        val layoutManager = recyclerView.layoutManager as LinearLayoutManager
-        val smoothScroller = object : LinearSmoothScroller(this) {
-            override fun getVerticalSnapPreference(): Int = SNAP_TO_START
+    private fun initViews() {
+        findViewById<TextView>(R.id.tv_notic).apply {
+            text = Html.fromHtml(getString(R.string.invite_reward_text), Html.FROM_HTML_MODE_LEGACY)
+        }
+        recyclerSuccessView = findViewById(R.id.invitationsuccessRecyclerView)
+        addSuccessListener()
 
-            override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
-                return 100f / displayMetrics.densityDpi // 控制滚动速度
+        recyclerRecordView = findViewById(R.id.invitationrecordRecyclerView)
+        addRecordListener()
+    }
+
+    private fun addSuccessListener(){
+        recyclerSuccessView.viewTreeObserver.addOnGlobalLayoutListener {
+            if (recyclerSuccessView.childCount > 0) {
+                // 计算预期高度(60dp转px)
+                val expectedHeight = dpToPx(60f)
+                if(itemHeight!= expectedHeight){
+                    // 修正所有item的高度
+                    for (i in 0 until recyclerSuccessView.childCount) {
+                        recyclerSuccessView.getChildAt(i).layoutParams.height = expectedHeight
+                    }
+                    // 请求重新布局
+                    recyclerSuccessView.requestLayout()
+                    itemHeight = expectedHeight
+                }
             }
         }
-        smoothScroller.targetPosition = position
-        layoutManager.startSmoothScroll(smoothScroller)
+        recyclerSuccessView.layoutManager = object : LinearLayoutManager(this@InvitationActivity) {
+            override fun onMeasure(
+                recycler: RecyclerView.Recycler, state: RecyclerView.State,
+                widthSpec: Int, heightSpec: Int
+            ) {
+                if (itemHeight > 0) {
+                    // 使用实际测量的高度
+                    setMeasuredDimension(
+                        View.resolveSize(widthSpec, width),
+                        itemHeight
+                    )
+                } else {
+                    // 默认高度60dp
+                    val defaultHeight = TypedValue.applyDimension(
+                        TypedValue.COMPLEX_UNIT_DIP, 60f,
+                        resources.displayMetrics
+                    ).toInt()
+                    setMeasuredDimension(
+                        View.resolveSize(widthSpec, width),
+                        defaultHeight
+                    )
+                }
+            }
+        }
+    }
+
+    private fun addRecordListener(){
+        recyclerRecordView.viewTreeObserver.addOnGlobalLayoutListener {
+            if (recyclerSuccessView.childCount > 0) {
+                // 计算预期高度(60dp转px)
+                val expectedHeight = dpToPx(60f)
+                if(itemHeight!= expectedHeight){
+                    // 修正所有item的高度
+                    for (i in 0 until recyclerSuccessView.childCount) {
+                        recyclerSuccessView.getChildAt(i).layoutParams.height = expectedHeight
+                    }
+                    // 请求重新布局
+                    recyclerSuccessView.requestLayout()
+                    itemHeight = expectedHeight
+                }
+            }
+        }
+        recyclerRecordView.layoutManager = object : LinearLayoutManager(this@InvitationActivity) {
+            override fun onMeasure(
+                recycler: RecyclerView.Recycler, state: RecyclerView.State,
+                widthSpec: Int, heightSpec: Int
+            ) {
+                if (itemHeight > 0) {
+                    // 使用实际测量的高度
+                    setMeasuredDimension(
+                        View.resolveSize(widthSpec, width),
+                        itemHeight
+                    )
+                } else {
+                    // 默认高度60dp
+                    val defaultHeight = TypedValue.applyDimension(
+                        TypedValue.COMPLEX_UNIT_DIP, 60f,
+                        resources.displayMetrics
+                    ).toInt()
+                    setMeasuredDimension(
+                        View.resolveSize(widthSpec, width),
+                        defaultHeight
+                    )
+                }
+            }
+        }
+    }
+
+    private fun initSuccessAdapter() {
+        adapter = InvitationAdapter(this, data).apply {
+            registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
+                override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
+                    // 数据插入时检查高度
+                    recyclerSuccessView.post {
+                        if (recyclerSuccessView.childCount > 0) {
+                            itemHeight = recyclerSuccessView.getChildAt(0).height
+                        }
+                    }
+                }
+            })
+        }
+        recyclerSuccessView.adapter = adapter
+    }
+
+    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 loadData() {
+        data.clear()
+        data.addAll(
+            listOf(
+                InvitationRecord("H****e", "获得了1天会员","已注册"),
+                InvitationRecord("U****r", "获得了2天会员","已注册"),
+                InvitationRecord("A****e", "获得了免广告特权","已注册"),
+                InvitationRecord("B****e", "获得了3天会员","已注册"),
+                InvitationRecord("C****o", "获得了4天会员","已注册")
+            )
+        )
+        adapter.notifyDataSetChanged()
+    }
+
+    private fun loadRecordData() {
+        recorddata.clear()
+        recorddata.addAll(
+            listOf(
+                InvitationRecord("M****e", "","未注册"),
+                InvitationRecord("Q****r", "","已注册"),
+                InvitationRecord("W****e", "","未注册"),
+                InvitationRecord("E****e", "","未注册"),
+                InvitationRecord("R****o", "","已注册")
+            )
+        )
+        recordadapter.notifyDataSetChanged()
+    }
+
+    private val scrollRunnable = object : Runnable {
+        override fun run() {
+            if (data.isEmpty() || itemHeight <= 0) {
+                handler.postDelayed(this, scrollInterval)
+                return
+            }
+
+            // 使用取模运算确保位置在有效范围内
+            currentScrollPosition++
+            currentRecordScrollPosition++
+
+            // 创建自定义平滑滚动器
+            val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) {
+                override fun getVerticalSnapPreference(): Int = SNAP_TO_START
+
+                override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int {
+                    // 计算需要滚动的距离,确保完整显示下一个item
+                    val top = view.top
+                    val height = view.height
+                    return when {
+                        snapPreference == SNAP_TO_START -> -top
+                        snapPreference == SNAP_TO_END -> -(top - (recyclerSuccessView.height - height))
+                        else -> -(top - (recyclerSuccessView.height / 2 - height / 2))
+                    }
+                }
+
+                override fun calculateTimeForScrolling(dx: Int): Int {
+                    // 根据滚动距离动态计算时间,保持匀速
+                    return maxOf((500f * abs(dx) / itemHeight).toInt(), 200)
+                }
+            }.apply {
+                targetPosition = currentScrollPosition
+            }
+
+            val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) {
+                override fun getVerticalSnapPreference(): Int = SNAP_TO_START
+
+                override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int {
+                    // 计算需要滚动的距离,确保完整显示下一个item
+                    val top = view.top
+                    val height = view.height
+                    return when {
+                        snapPreference == SNAP_TO_START -> -top
+                        snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height))
+                        else -> -(top - (recyclerRecordView.height / 2 - height / 2))
+                    }
+                }
+
+                override fun calculateTimeForScrolling(dx: Int): Int {
+                    // 根据滚动距离动态计算时间,保持匀速
+                    return maxOf((500f * abs(dx) / itemHeight).toInt(), 200)
+                }
+            }.apply {
+                targetPosition = currentRecordScrollPosition
+            }
+
+            // 启动平滑滚动
+            recyclerSuccessView.layoutManager?.startSmoothScroll(smoothScroller)
+
+            recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller)
+
+            // 更智能的边界检测
+            (recyclerSuccessView.layoutManager as? LinearLayoutManager)?.let { lm ->
+                val lastVisible = lm.findLastVisibleItemPosition()
+                val totalItems = adapter.itemCount
+
+                // 当接近"虚拟列表"末尾时,跳转到中间位置
+                if (lastVisible >= totalItems - 3) {
+                    val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems)
+                    currentScrollPosition = jumpPosition
+                    recyclerSuccessView.scrollToPosition(jumpPosition)
+                }
+            }
+
+            (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm ->
+                val lastVisible = lm.findLastVisibleItemPosition()
+                val totalItems = recordadapter.itemCount
+
+                // 当接近"虚拟列表"末尾时,跳转到中间位置
+                if (lastVisible >= totalItems - 3) {
+                    val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems)
+                    currentRecordScrollPosition = jumpPosition
+                    recyclerRecordView.scrollToPosition(jumpPosition)
+                }
+            }
+
+            handler.postDelayed(this, scrollInterval)
+        }
+    }
+
+    private fun pxToDp(px: Int, context: Context): Int {
+        return (px / (context.resources.displayMetrics.density)).toInt()
+    }
+    private fun dpToPx(dp: Float): Int {
+        return (dp * resources.displayMetrics.density).toInt()
     }
 
     private fun startAutoScroll() {
-        handler.postDelayed(scrollRunnable, 2000)
-    }
-
-    private fun stopAutoScroll() {
-        handler.removeCallbacks(scrollRunnable)
+        handler.removeCallbacks(scrollRunnable) // 先移除之前的回调
+        handler.postDelayed(scrollRunnable, scrollInterval)
     }
 
     override fun onPause() {
+        handler.removeCallbacks(scrollRunnable)
         super.onPause()
-        stopAutoScroll()
     }
 
     override fun onResume() {
diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
index 4d79729..38a6f08 100644
--- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -31,7 +31,9 @@
 import com.google.android.material.snackbar.Snackbar
 import kotlinx.coroutines.launch
 import com.bumptech.glide.Glide
+import com.example.firstapp.MainActivity
 import com.example.firstapp.database.response.UserInfo
+import com.example.firstapp.ui.invitation.InvitationActivity
 
 class NotificationsFragment : Fragment() {
 
@@ -176,7 +178,9 @@
 
         // 好友邀请
         binding.layoutInvite.setOnClickListener {
-            shareToWechat()
+            // 跳转到邀请活动页面
+            val intent = Intent(requireActivity(), InvitationActivity::class.java)
+            startActivity(intent)
         }
 
         // AI助手
diff --git a/app/src/main/res/drawable/bg_gradient.xml b/app/src/main/res/drawable/bg_gradient.xml
new file mode 100644
index 0000000..c5b2beb
--- /dev/null
+++ b/app/src/main/res/drawable/bg_gradient.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:startColor="#000000"
+        android:endColor="#888888"
+        android:angle="270"
+        android:type="linear"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/cell_border.xml b/app/src/main/res/drawable/cell_border.xml
new file mode 100644
index 0000000..186300c
--- /dev/null
+++ b/app/src/main/res/drawable/cell_border.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape>
+            <solid android:color="#CCCCCC" />
+            <size android:height="1dp" />
+        </shape>
+    </item>
+    <item android:right="1dp">
+        <shape>
+            <solid android:color="#CCCCCC" />
+            <size android:width="1dp" />
+        </shape>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/table_border.xml b/app/src/main/res/drawable/table_border.xml
new file mode 100644
index 0000000..af40445
--- /dev/null
+++ b/app/src/main/res/drawable/table_border.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+        android:width="1dp"
+        android:color="#CCCCCC" />
+    <solid android:color="#FFFFFF" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invitation_main.xml b/app/src/main/res/layout/activity_invitation_main.xml
index cdc5a91..e92d712 100644
--- a/app/src/main/res/layout/activity_invitation_main.xml
+++ b/app/src/main/res/layout/activity_invitation_main.xml
@@ -1,235 +1,253 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:background="#F0F0F0">
+    android:background="#F0F0F0"
+    android:fillViewport="true">
 
-    <!-- 标题栏 -->
-    <TextView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="邀请有礼"
-        android:textSize="20sp"
-        android:gravity="center"
-        android:padding="16dp"
-        android:textColor="#333333"/>
-
-    <!-- 横幅广告区域 -->
-    <ImageView
-        android:layout_width="match_parent"
-        android:layout_height="200dp"
-        android:src="@drawable/gift_one"
-        android:scaleType="fitXY"
-        android:layout_marginBottom="16dp"
-        android:background="@drawable/rounded_corner_image"
-        android:padding="1dp" />
-
-    <!-- 邀请成功提示区域 -->
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:background="#FFFFFF"
-        android:layout_marginBottom="16dp">
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/invitationsuccessRecyclerView"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:maxHeight="100dp"
-            android:paddingStart="16dp"
-            android:paddingEnd="16dp"
-            android:paddingBottom="16dp"
-            android:clipToPadding="false"
-            android:overScrollMode="never"/>
-    </LinearLayout>
+        android:orientation="vertical">
 
-    <!-- 邀请按钮区域 -->
-    <Button
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="立即邀请好友"
-        android:backgroundTint="#FF0000"
-        android:textColor="#FFFFFF"
-        android:padding="16dp"
-        android:textSize="16sp"
-        android:layout_marginBottom="16dp"/>
-
-    <!-- 邀请任务表格区域 -->
-    <TableLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:padding="16dp"
-        android:background="#FFFFFF"
-        android:layout_marginBottom="16dp">
-
-        <TableRow>
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="邀请人数"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="邀请奖励"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="被邀请人奖励"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-        </TableRow>
-
-        <TableRow>
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="1人"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="3天会员"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="1天会员"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-        </TableRow>
-
-        <TableRow>
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="3人"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="免广告特权 (7天)"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="1天会员"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-        </TableRow>
-
-        <TableRow>
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="5人"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="7天会员"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="1天会员"
-                android:textSize="16sp"
-                android:padding="8dp"
-                android:textColor="#333333"/>
-        </TableRow>
-    </TableLayout>
-
-    <!-- 邀请记录区域 -->
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:padding="16dp"
-        android:background="#FFFFFF">
-
+        <!-- 标题栏 -->
         <TextView
-            android:layout_width="wrap_content"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="我的邀请记录"
-            android:textSize="16sp"
-            android:paddingBottom="8dp"
-            android:textColor="#333333"/>
+            android:gravity="center"
+            android:padding="16dp"
+            android:text="邀请有礼"
+            android:textColor="#333333"
+            android:textSize="13sp" />
 
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:paddingBottom="8dp">
+            android:background="@drawable/bg_gradient"
+            android:orientation="vertical">
 
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Hnnnnne"
-                android:textSize="16sp"
-                android:paddingEnd="8dp"
-                android:textColor="#333333"/>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginHorizontal="11dp"
+                android:orientation="vertical">
 
-            <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="待注册"
-                android:background="#CCCCCC"
-                android:textColor="#000000"
-                android:padding="8dp"
-                android:textSize="14sp"/>
-        </LinearLayout>
+                <!-- 提示烂 -->
+                <TextView
+                    android:id="@+id/tv_notic"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:padding="16dp"
+                    android:textColor="#FFFFFF"
+                    android:textSize="15sp" />
 
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal">
+                <!-- 横幅广告区域 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="160dp"
+                    android:layout_marginBottom="16dp"
+                    app:cardCornerRadius="13dp"
+                    app:cardPreventCornerOverlap="true">
 
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="Hnnnnne"
-                android:textSize="16sp"
-                android:paddingEnd="8dp"
-                android:textColor="#333333"/>
+                    <ImageView
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:scaleType="centerCrop"
+                        android:src="@drawable/gift_one" />
+                </androidx.cardview.widget.CardView>
 
-            <Button
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="已注册"
-                android:background="#008800"
-                android:textColor="#FFFFFF"
-                android:padding="8dp"
-                android:textSize="14sp"/>
+                <!-- 邀请成功提示区域 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="20dp"
+                    app:cardCornerRadius="8dp">
+
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/invitationsuccessRecyclerView"
+                        android:layout_width="match_parent"
+                        android:layout_height="60dp"
+                        android:nestedScrollingEnabled="false"
+                        android:overScrollMode="never" />
+                </androidx.cardview.widget.CardView>
+
+                <!-- 邀请按钮区域 -->
+                <Button
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="26dp"
+                    android:backgroundTint="#FF0000"
+                    android:insetTop="0dp"
+                    android:insetBottom="0dp"
+                    android:padding="12dp"
+                    android:text="立即邀请好友"
+                    android:textColor="#FFFFFF"
+                    android:textSize="16sp"
+                    app:cornerRadius="10dp" />
+
+                <!-- 邀请任务表格区域 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginBottom="3dp"
+                    app:cardCornerRadius="6dp"
+                    app:cardPreventCornerOverlap="true">
+
+                    <TableLayout
+                        android:id="@+id/tableLayout"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/table_border"
+                        android:shrinkColumns="*"
+                        android:stretchColumns="*">
+
+                        <TableRow>
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="邀请人数"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="邀请奖励"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="被邀请人奖励"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+                        </TableRow>
+
+                        <TableRow>
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="1人"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="3天会员"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="1天会员"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+                        </TableRow>
+
+                        <TableRow>
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="3人"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="免广告特权 (7天)"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="1天会员"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+                        </TableRow>
+
+                        <TableRow>
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="5人"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="7天会员"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:padding="6dp"
+                                android:text="1天会员"
+                                android:textAlignment="center"
+                                android:textColor="#333333"
+                                android:textSize="12sp" />
+                        </TableRow>
+                    </TableLayout>
+
+
+                </androidx.cardview.widget.CardView>
+
+                <!-- 邀请记录区域 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginBottom="20dp"
+                    app:cardCornerRadius="6dp"
+                    app:cardPreventCornerOverlap="true">
+                    <androidx.recyclerview.widget.RecyclerView
+                        android:id="@+id/invitationrecordRecyclerView"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:nestedScrollingEnabled="false"
+                        android:overScrollMode="never" />
+                </androidx.cardview.widget.CardView>
+
+                <!-- 添加一个权重为1的View,用于填充剩余空间 -->
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1" />
+            </LinearLayout>
         </LinearLayout>
     </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
+</ScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invitation_record.xml b/app/src/main/res/layout/activity_invitation_record.xml
new file mode 100644
index 0000000..dff7571
--- /dev/null
+++ b/app/src/main/res/layout/activity_invitation_record.xml
@@ -0,0 +1,35 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="60dp"
+    android:minHeight="60dp"
+    android:gravity="center_vertical"
+    android:orientation="horizontal"
+    android:padding="8dp">
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:src="@drawable/avatar"
+        android:paddingLeft="10dp" />
+
+    <TextView
+        android:id="@+id/recordmessage"
+        android:layout_width="260dp"
+        android:layout_height="60dp"
+        android:layout_marginStart="12dp"
+        android:paddingTop="20dp"
+        android:textAlignment="center"
+        android:textColor="#333333"
+        android:textSize="14sp" />
+
+    <TextView
+        android:id="@+id/recordstatus"
+        android:layout_width="match_parent"
+        android:layout_height="60dp"
+        android:layout_marginStart="12dp"
+        android:textColor="#333333"
+        android:textAlignment="center"
+        android:paddingTop="20dp"
+        android:textSize="14sp" />
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invitation_success.xml b/app/src/main/res/layout/activity_invitation_success.xml
index 7a235b4..d939b17 100644
--- a/app/src/main/res/layout/activity_invitation_success.xml
+++ b/app/src/main/res/layout/activity_invitation_success.xml
@@ -1,21 +1,25 @@
-<?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"
+    android:layout_height="60dp"
+    android:minHeight="60dp"
+    android:gravity="center_vertical"
     android:orientation="horizontal"
-    android:paddingVertical="16dp">
+    android:padding="8dp">
 
-    <ImageView
+    <de.hdodenhof.circleimageview.CircleImageView
         android:id="@+id/avatar"
         android:layout_width="40dp"
         android:layout_height="40dp"
-        android:src="@drawable/avatar"/>
+        android:src="@drawable/avatar"
+        android:paddingLeft="10dp" />
 
     <TextView
         android:id="@+id/message"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textSize="16sp"
-        android:paddingStart="8dp"
-        android:textColor="#333333"/>
+        android:layout_width="match_parent"
+        android:layout_height="60dp"
+        android:layout_marginStart="12dp"
+        android:textColor="#333333"
+        android:textAlignment="center"
+        android:paddingTop="20dp"
+        android:textSize="14sp" />
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f507e55..d4e14b0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -91,5 +91,8 @@
         vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
     </string>
 
+    <string name="invite_reward_text"><![CDATA[
+    每邀请1位新用户<font color="#FF0000"><b><i><u>可得</u></i></b></font>
+]]></string>
 
 </resources>
\ No newline at end of file

--
Gitblit v1.9.3