zhujie
2025-04-03 db2e408f6c2eddc363ed76e0f5fd1e59a02aa175
邀请有礼
已修改8个文件
已添加5个文件
779 ■■■■ 文件已修改
app/build.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt 332 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/bg_gradient.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/cell_border.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/table_border.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_invitation_main.xml 270 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_invitation_record.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_invitation_success.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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'
}
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)
    }
}
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)
    }
}
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
)
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) {
    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()
        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
                }
            }
        }
        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 calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
                return 100f / displayMetrics.densityDpi // 控制滚动速度
                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))
            }
        }
        smoothScroller.targetPosition = position
        layoutManager.startSmoothScroll(smoothScroller)
                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() {
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助手
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>
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>
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>
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">
    <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:text="邀请有礼"
        android:textSize="20sp"
        android:gravity="center"
        android:padding="16dp"
        android:textColor="#333333"/>
            android:text="邀请有礼"
            android:textColor="#333333"
            android:textSize="13sp" />
    <!-- 横幅广告区域 -->
    <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">
            android:background="@drawable/bg_gradient"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginHorizontal="11dp"
                android:orientation="vertical">
                <!-- 提示烂 -->
                <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" />
                <!-- 横幅广告区域 -->
                <androidx.cardview.widget.CardView
                    android:layout_width="match_parent"
                    android:layout_height="160dp"
                    android:layout_marginBottom="16dp"
                    app:cardCornerRadius="13dp"
                    app:cardPreventCornerOverlap="true">
                    <ImageView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:scaleType="centerCrop"
                        android:src="@drawable/gift_one" />
                </androidx.cardview.widget.CardView>
                <!-- 邀请成功提示区域 -->
                <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="wrap_content"
            android:maxHeight="100dp"
            android:paddingStart="16dp"
            android:paddingEnd="16dp"
            android:paddingBottom="16dp"
            android:clipToPadding="false"
                        android:layout_height="60dp"
                        android:nestedScrollingEnabled="false"
            android:overScrollMode="never"/>
    </LinearLayout>
                </androidx.cardview.widget.CardView>
    <!-- 邀请按钮区域 -->
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="立即邀请好友"
                    android:layout_marginBottom="26dp"
        android:backgroundTint="#FF0000"
                    android:insetTop="0dp"
                    android:insetBottom="0dp"
                    android:padding="12dp"
                    android:text="立即邀请好友"
        android:textColor="#FFFFFF"
        android:padding="16dp"
        android:textSize="16sp"
        android:layout_marginBottom="16dp"/>
                    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:padding="16dp"
        android:background="#FFFFFF"
        android:layout_marginBottom="16dp">
                        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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                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:textSize="16sp"
                android:padding="8dp"
                android:textColor="#333333"/>
                                android:textAlignment="center"
                                android:textColor="#333333"
                                android:textSize="12sp" />
        </TableRow>
    </TableLayout>
                </androidx.cardview.widget.CardView>
    <!-- 邀请记录区域 -->
    <LinearLayout
                <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:orientation="vertical"
        android:padding="16dp"
        android:background="#FFFFFF">
                        android:nestedScrollingEnabled="false"
                        android:overScrollMode="never" />
                </androidx.cardview.widget.CardView>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的邀请记录"
            android:textSize="16sp"
            android:paddingBottom="8dp"
            android:textColor="#333333"/>
        <LinearLayout
                <!-- 添加一个权重为1的View,用于填充剩余空间 -->
                <View
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingBottom="8dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hnnnnne"
                android:textSize="16sp"
                android:paddingEnd="8dp"
                android:textColor="#333333"/>
            <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>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hnnnnne"
                android:textSize="16sp"
                android:paddingEnd="8dp"
                android:textColor="#333333"/>
            <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"/>
                    android:layout_height="0dp"
                    android:layout_weight="1" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
</ScrollView>
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>
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>
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>