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