| | |
| | | |
| | | //加载数据 |
| | | getInvitereward() |
| | | //loadData() |
| | | |
| | | //loadRecordData() |
| | | |
| | | //启动轮播 |
| | | startAutoScroll() |
| | |
| | | |
| | | //邀请码 |
| | | 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 |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | 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 |
| | |
| | | } |
| | | } |
| | | } |
| | | // 记录列表 |
| | | recyclerRecordView = findViewById(R.id.invitationrecordRecyclerView) |
| | | recyclerRecordView.layoutManager = LinearLayoutManager(this) |
| | | } |
| | | |
| | | private fun initSuccessAdapter() { |
| | |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 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 { |
| | |
| | | |
| | | // 使用取模运算确保位置在有效范围内 |
| | | currentScrollPosition++ |
| | | //currentRecordScrollPosition++ |
| | | |
| | | // 创建自定义平滑滚动器 |
| | | val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) { |
| | |
| | | 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 -> |
| | |
| | | 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) |
| | | } |