f3e60d24d0f24dc5cf7d77f9b871f416370e9132..88b00f3fc74446a1727c93722c7b64179b45a9db
8 天以前 zhujie
Merge branch 'master' of http://47.96.225.205:8888/r/FirstApp2
88b00f 对比 | 目录
8 天以前 zhujie
样式调整
a87376 对比 | 目录
已修改4个文件
已添加1个文件
184 ■■■■ 文件已修改
app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/table_cell_border.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/table_cell_border_no_right.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_invitation_main.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/adapter/InvitationRecordAdapter.kt
@@ -11,7 +11,6 @@
import com.example.firstapp.entity.InvitationRecord
import com.example.firstapp.utils.Log
class InvitationRecordAdapter(
    private val context: Context,
    private val data: List<InvitationRecord>,
@@ -20,17 +19,16 @@
    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 onBindViewHolder(holder: InvitationRecordViewHolder, position: Int) {
        val record = data[position] // 直接使用实际位置
        holder.recordmessage.text = record.userName
        holder.recordstatus.text = record.status
    }
    override fun getItemCount() = if (data.isEmpty()) 0 else Int.MAX_VALUE
    override fun getItemCount() = data.size // 直接返回实际数据大小
    class InvitationRecordViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val recordmessage: TextView = itemView.findViewById(R.id.recordmessage)
app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -72,9 +72,6 @@
        //加载数据
        getInvitereward()
        //loadData()
        //loadRecordData()
        //启动轮播
        startAutoScroll()
@@ -87,7 +84,6 @@
        //邀请码
        val invitationCodeText = findViewById<TextView>(R.id.invitationCodeText)
        //invitationCodeText.text = "A1B2"
        invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode());
        findViewById<Button>(R.id.copyButton).setOnClickListener {
            val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
@@ -100,88 +96,40 @@
        }
    }
    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) {
        recyclerSuccessView.layoutManager = object : LinearLayoutManager(this) {
            override fun onMeasure(
                recycler: RecyclerView.Recycler, state: RecyclerView.State,
                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
@@ -193,6 +141,9 @@
                }
            }
        }
        // 记录列表
        recyclerRecordView = findViewById(R.id.invitationrecordRecyclerView)
        recyclerRecordView.layoutManager = LinearLayoutManager(this)
    }
    private fun initSuccessAdapter() {
@@ -212,18 +163,7 @@
    }
    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
                        }
                    }
                }
            })
        }
        recordadapter = InvitationRecordAdapter(this, recorddata)
        recyclerRecordView.adapter = recordadapter
    }
@@ -263,34 +203,6 @@
            }
        }
    }
//    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 fun showImagePreviewDialog() {
        val dialog = Dialog(this, android.R.style.Theme_Translucent_NoTitleBar).apply {
@@ -380,7 +292,6 @@
            // 使用取模运算确保位置在有效范围内
            currentScrollPosition++
            //currentRecordScrollPosition++
            // 创建自定义平滑滚动器
            val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) {
@@ -405,32 +316,9 @@
                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 ->
@@ -444,18 +332,6 @@
                    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)
        }
app/src/main/res/drawable/table_cell_border.xml
@@ -1,4 +1,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="0.5dp" android:color="#DDDDDD"/>
    <padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/>
    <solid android:color="#FFFFFF" />
    <!-- 统一设置所有边线 -->
    <stroke
        android:width="1dp"
        android:color="#DDDDDD" />
</shape>
app/src/main/res/drawable/table_cell_border_no_right.xml
对比新文件
@@ -0,0 +1,16 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#FFFFFF" />
            <stroke
                android:width="1dp"
                android:color="#DDDDDD" />
        </shape>
    </item>
    <!-- 用白色覆盖右边框 -->
    <item android:right="1dp">
        <shape>
            <solid android:color="#FFFFFF" />
        </shape>
    </item>
</layer-list>
app/src/main/res/layout/activity_invitation_main.xml
@@ -159,14 +159,13 @@
                            android:id="@+id/tableLayout"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:background="@drawable/table_border"
                            android:paddingLeft="16dp"
                            android:paddingRight="16dp"
                            android:paddingBottom="16dp"
                            android:shrinkColumns="*"
                            android:stretchColumns="*">
                            <TableRow android:background="@drawable/table_cell_border">
                            <TableRow>
                                <TextView
                                    android:layout_width="wrap_content"