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>