From a895ef58396939abd792d1cc2fe6594efa4ffda7 Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期三, 26 三月 2025 17:56:14 +0800
Subject: [PATCH] 邀请有礼页面

---
 app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt                |    6 
 app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt |    4 
 app/src/main/res/drawable/rounded_corner_image.xml                               |    5 
 app/src/main/res/layout/activity_invitation_main.xml                             |  235 +++++++++++++++++++++++++++++
 app/src/main/AndroidManifest.xml                                                 |    3 
 app/src/main/res/drawable/gift_one.png                                           |    0 
 app/src/main/res/layout/activity_invitation_success.xml                          |   21 ++
 app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt              |   36 ++++
 app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt       |  102 ++++++++++++
 app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt |   13 +
 app/src/main/res/drawable/avatar.png                                             |    0 
 11 files changed, 424 insertions(+), 1 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f471d9e..ddf2f77 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -111,6 +111,9 @@
             android:name=".activity.ContentDetailActivity"
             android:theme="@style/Theme.ContentDetail"
             android:exported="false" />
+        <activity
+            android:name=".ui.invitation.InvitationActivity"
+            android:exported="false"/>
 
     </application>
 
diff --git a/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
new file mode 100644
index 0000000..b045175
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/adapter/InvitationAdapter.kt
@@ -0,0 +1,36 @@
+package com.example.firstapp.adapter
+
+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
+
+class InvitationAdapter : RecyclerView.Adapter<InvitationAdapter.ViewHolder>() {
+
+    private var records = emptyList<InvitationRecord>()
+
+    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)
+            .inflate(R.layout.activity_invitation_success, parent, false)
+        return ViewHolder(view)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val record = records[position]
+        holder.message.text = "${record.userName}邀请好友,${record.reward}"
+    }
+
+    override fun getItemCount() = records.size
+
+    fun submitList(newList: List<InvitationRecord>) {
+        records = newList
+        notifyDataSetChanged()
+    }
+}
\ 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
new file mode 100644
index 0000000..938bac5
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
@@ -0,0 +1,6 @@
+package com.example.firstapp.entity
+
+data class InvitationRecord(
+    val userName: String,
+    val reward: 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
new file mode 100644
index 0000000..51fc5fc
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -0,0 +1,102 @@
+package com.example.firstapp.ui.invitation
+
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.util.DisplayMetrics
+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.entity.InvitationRecord
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.Executors
+
+class InvitationActivity : AppCompatActivity() {
+
+    private lateinit var recyclerView: RecyclerView
+    private lateinit var adapter: InvitationAdapter
+    private var currentPosition = 0
+    private val handler = Handler(Looper.getMainLooper())
+    private lateinit var scrollRunnable: Runnable
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_invitation_main)
+
+        setupRecyclerView()
+        loadData()
+        setupAutoScroll()
+    }
+
+    private fun setupRecyclerView() {
+        recyclerView = findViewById(R.id.invitationsuccessRecyclerView)
+        recyclerView.layoutManager = LinearLayoutManager(this).apply {
+            stackFromEnd = false // 从顶部开始布局
+        }
+        adapter = InvitationAdapter()
+        recyclerView.adapter = adapter
+    }
+
+    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
+
+            override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
+                return 100f / displayMetrics.densityDpi // 控制滚动速度
+            }
+        }
+        smoothScroller.targetPosition = position
+        layoutManager.startSmoothScroll(smoothScroller)
+    }
+
+    private fun startAutoScroll() {
+        handler.postDelayed(scrollRunnable, 2000)
+    }
+
+    private fun stopAutoScroll() {
+        handler.removeCallbacks(scrollRunnable)
+    }
+
+    override fun onPause() {
+        super.onPause()
+        stopAutoScroll()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        startAutoScroll()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt b/app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt
new file mode 100644
index 0000000..d339a03
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/LineByLineSmoothScroller.kt
@@ -0,0 +1,13 @@
+import android.content.Context
+import android.util.DisplayMetrics
+import androidx.recyclerview.widget.LinearSmoothScroller
+
+class LineByLineSmoothScroller(context: Context) : LinearSmoothScroller(context) {
+    override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
+        return 100f / displayMetrics.densityDpi // 控制滚动速度
+    }
+
+    override fun getVerticalSnapPreference(): Int {
+        return SNAP_TO_START // 从顶部开始对齐
+    }
+}
\ No newline at end of file
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 455a039..892a16a 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
@@ -19,6 +19,7 @@
 import com.example.firstapp.activity.ContentDetailActivity
 import com.example.firstapp.database.service.RetrofitClient
 import com.example.firstapp.databinding.FragmentNotificationsBinding
+import com.example.firstapp.ui.invitation.InvitationActivity
 import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2
 import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther
 import kotlinx.coroutines.launch
@@ -124,7 +125,8 @@
 
         // 分享给好友
         binding.shareToFriends.setOnClickListener {
-            shareToWechat()
+            val intent = Intent(requireActivity(), InvitationActivity::class.java)
+            startActivity(intent)
         }
 
         // 隐私协议
diff --git a/app/src/main/res/drawable/avatar.png b/app/src/main/res/drawable/avatar.png
new file mode 100644
index 0000000..04a43e1
--- /dev/null
+++ b/app/src/main/res/drawable/avatar.png
Binary files differ
diff --git a/app/src/main/res/drawable/gift_one.png b/app/src/main/res/drawable/gift_one.png
new file mode 100644
index 0000000..d6bd848
--- /dev/null
+++ b/app/src/main/res/drawable/gift_one.png
Binary files differ
diff --git a/app/src/main/res/drawable/rounded_corner_image.xml b/app/src/main/res/drawable/rounded_corner_image.xml
new file mode 100644
index 0000000..0f52b53
--- /dev/null
+++ b/app/src/main/res/drawable/rounded_corner_image.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="@android:color/transparent" />
+    <corners android:radius="10dp" />
+</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
new file mode 100644
index 0000000..cdc5a91
--- /dev/null
+++ b/app/src/main/res/layout/activity_invitation_main.xml
@@ -0,0 +1,235 @@
+<?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="match_parent"
+    android:orientation="vertical"
+    android:background="#F0F0F0">
+
+    <!-- 标题栏 -->
+    <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>
+
+    <!-- 邀请按钮区域 -->
+    <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_height="wrap_content"
+            android:text="我的邀请记录"
+            android:textSize="16sp"
+            android:paddingBottom="8dp"
+            android:textColor="#333333"/>
+
+        <LinearLayout
+            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"/>
+        </LinearLayout>
+    </LinearLayout>
+
+</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
new file mode 100644
index 0000000..7a235b4
--- /dev/null
+++ b/app/src/main/res/layout/activity_invitation_success.xml
@@ -0,0 +1,21 @@
+<?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:orientation="horizontal"
+    android:paddingVertical="16dp">
+
+    <ImageView
+        android:id="@+id/avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:src="@drawable/avatar"/>
+
+    <TextView
+        android:id="@+id/message"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="16sp"
+        android:paddingStart="8dp"
+        android:textColor="#333333"/>
+</LinearLayout>
\ No newline at end of file

--
Gitblit v1.9.3