Prechádzať zdrojové kódy

feat: 改用gesture判断双击;外部调用viewbinding用lifecycleScope包裹

pengwuliang 10 mesiacov pred
rodič
commit
091a4e0780

+ 21 - 21
app/src/main/java/com/adealink/weparty/commonui/widget/CommonTabLayout.kt

@@ -6,7 +6,9 @@ import android.graphics.Typeface
 import android.graphics.drawable.Drawable
 import android.util.AttributeSet
 import android.util.TypedValue
+import android.view.GestureDetector
 import android.view.LayoutInflater
+import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
 import android.widget.LinearLayout
@@ -55,6 +57,15 @@ class CommonTabLayout @JvmOverloads constructor(
     private var tabPaddingHorizontal: Int = 4.dp()
     private var tabPaddingVertical: Int = 0
     private var fixedTabScrollableMode: Boolean = false
+    private var scrollToTop: (()->Unit)? = null
+    private val gestureDetector: GestureDetector by lazy {
+        GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
+            override fun onDoubleTap(e: MotionEvent): Boolean {
+                scrollToTop?.invoke()
+                return true
+            }
+        })
+    }
 
     init {
         val typedArray: TypedArray = context.obtainStyledAttributes(
@@ -179,6 +190,7 @@ class CommonTabLayout @JvmOverloads constructor(
     ) {
         this.viewPager2 = viewPager2
         this.tabFragmentStateAdapter = tabFragmentStateAdapter
+        this.scrollToTop = scrollToTop
         viewPager2?.let {
             TabLayoutMediator(
                 tabLayout, it
@@ -189,6 +201,10 @@ class CommonTabLayout @JvmOverloads constructor(
                     } else {
                         tab.setCustomView(R.layout.layout_common_tab_item_match_parent)
                     }
+                    tab.view.setOnTouchListener { v, event ->
+                        gestureDetector.onTouchEvent(event)
+                        false
+                    }
                     updateTabView(
                         tab,
                         currentItem == position,
@@ -199,9 +215,6 @@ class CommonTabLayout @JvmOverloads constructor(
             }.attach()
         }
         tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
-            private var lastClickTime = 0L
-            private var lastClickPosition = -1
-
             override fun onTabSelected(tab: TabLayout.Tab?) {
                 updateTabView(tab, true, null, showIndicator)
             }
@@ -211,14 +224,6 @@ class CommonTabLayout @JvmOverloads constructor(
             }
 
             override fun onTabReselected(tab: TabLayout.Tab?) {
-                val currentTime = System.currentTimeMillis()
-                val position = tab?.position ?: 0
-                if (lastClickPosition == position && currentTime - lastClickTime < 300) {
-                    scrollToTop?.invoke()
-                }
-
-                lastClickTime = currentTime
-                lastClickPosition = position
             }
         })
     }
@@ -240,6 +245,7 @@ class CommonTabLayout @JvmOverloads constructor(
         scrollToTop: (() -> Unit)? = null
     ) {
         this.viewPager2 = viewPager2
+        this.scrollToTop = scrollToTop
         viewPager2?.let {
             TabLayoutMediator(
                 tabLayout, it
@@ -250,6 +256,10 @@ class CommonTabLayout @JvmOverloads constructor(
                     } else {
                         tab.setCustomView(R.layout.layout_common_tab_item_match_parent)
                     }
+                    tab.view.setOnTouchListener { v, event ->
+                        gestureDetector.onTouchEvent(event)
+                        false
+                    }
                     updateTabView(
                         tab,
                         currentItem == position,
@@ -259,8 +269,6 @@ class CommonTabLayout @JvmOverloads constructor(
             }.attach()
         }
         tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
-            private var lastClickTime = 0L
-            private var lastClickPosition = -1
 
             override fun onTabSelected(tab: TabLayout.Tab?) {
                 updateTabView(tab, true)
@@ -271,14 +279,6 @@ class CommonTabLayout @JvmOverloads constructor(
             }
 
             override fun onTabReselected(tab: TabLayout.Tab?) {
-                val currentTime = System.currentTimeMillis()
-                val position = tab?.position ?: 0
-                if (lastClickPosition == position && currentTime - lastClickTime < 300) {
-                    scrollToTop?.invoke()
-                }
-
-                lastClickTime = currentTime
-                lastClickPosition = position
             }
         })
     }

+ 3 - 1
app/src/main/java/com/adealink/weparty/module/userlist/fragment/HomeBaseUserListFragment.kt

@@ -183,7 +183,9 @@ abstract class HomeBaseUserListFragment : BaseFragment(R.layout.layout_home_user
     }
 
     override fun scrollToTop() {
-        binding.rvUserList.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvUserList.scrollToPosition(0)
+        }
     }
 
     /**

+ 16 - 13
app/src/main/java/com/adealink/weparty/ui/home/BaseHomeFragment.kt

@@ -2,6 +2,8 @@ package com.adealink.weparty.ui.home
 
 import android.annotation.SuppressLint
 import android.os.Bundle
+import android.view.GestureDetector
+import android.view.MotionEvent
 import androidx.annotation.CallSuper
 import androidx.annotation.LayoutRes
 import androidx.fragment.app.Fragment
@@ -95,7 +97,14 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
     private val countryViewModel by fastLazy { ProfileModule.getCountryViewModel(this) }
 
     private lateinit var homePagerAdapter: HomeProfilePageAdapter
-
+    private val gestureDetector: GestureDetector by lazy {
+        GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
+            override fun onDoubleTap(e: MotionEvent): Boolean {
+                scrollToTop()
+                return true
+            }
+        })
+    }
     private val mainTabKey by lazy {
         arguments?.getString(AppModule.Main.EXTRA_MAIN_TAB)
     }
@@ -123,6 +132,10 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
             false
         ) { tabLayout, position ->
             tabLayout.setCustomView(R.layout.layout_main_tab_normal)
+            tabLayout.view.setOnTouchListener { v, event ->
+                gestureDetector.onTouchEvent(event)
+                false
+            }
             tabLayout.customView?.let { customView ->
                 val customBinding = LayoutMainTabNormalBinding.bind(customView)
                 val tab = getTab(position) ?: return@let
@@ -135,8 +148,6 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
             }
         }.attach()
         tlTab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
-            private var lastClickTime = 0L
-            private var lastClickPosition = -1
 
             override fun onTabSelected(tab: TabLayout.Tab?) {
                 HomeUIUtil.selectedHomeTab = HOME_TABS[tab?.position ?: 0].type
@@ -153,14 +164,6 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
             }
 
             override fun onTabReselected(tab: TabLayout.Tab?) {
-                val currentTime = System.currentTimeMillis()
-                val position = tab?.position ?: 0
-                if (lastClickPosition == position && currentTime - lastClickTime < 300) {
-                    scrollToTop(position)
-                }
-
-                lastClickTime = currentTime
-                lastClickPosition = position
             }
 
         })
@@ -168,8 +171,8 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
         setDefaultTab(tabKey = mainTabKey)
     }
 
-    protected fun scrollToTop(pos: Int) {
-        val fg = homePagerAdapter.getFragment(this, pos)
+    protected fun scrollToTop() {
+        val fg = homePagerAdapter.getFragment(this, vpContent.currentItem)
         if (fg is IScrollManager) {
             fg.scrollToTop()
         }

+ 5 - 1
module/follow/src/main/java/com/adealink/weparty/follow/FansListFragment.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.follow
 import android.os.Bundle
 import android.view.View
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
@@ -23,6 +24,7 @@ import com.adealink.weparty.module.follow.data.RelationItemData
 import com.adealink.weparty.module.follow.data.RelationShipType
 import com.adealink.weparty.module.follow.data.RelationUserItemData
 import com.adealink.weparty.ui.IScrollManager
+import kotlinx.coroutines.launch
 
 class FansListFragment : BaseFragment(R.layout.fragment_fans_list), IScrollManager {
     private val binding by viewBinding(FragmentFansListBinding::bind)
@@ -89,6 +91,8 @@ class FansListFragment : BaseFragment(R.layout.fragment_fans_list), IScrollManag
     }
 
     override fun scrollToTop() {
-        binding.rvFans.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvFans.scrollToPosition(0)
+        }
     }
 }

+ 5 - 1
module/follow/src/main/java/com/adealink/weparty/follow/FollowListFragment.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.follow
 
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
@@ -21,6 +22,7 @@ import com.adealink.weparty.module.follow.data.RelationItemData
 import com.adealink.weparty.module.follow.data.RelationShipType
 import com.adealink.weparty.module.follow.data.RelationUserItemData
 import com.adealink.weparty.ui.IScrollManager
+import kotlinx.coroutines.launch
 
 class FollowListFragment: BaseFragment(R.layout.fragment_follow_list), IScrollManager {
     private val binding by viewBinding(FragmentFollowListBinding::bind)
@@ -83,6 +85,8 @@ class FollowListFragment: BaseFragment(R.layout.fragment_follow_list), IScrollMa
     }
 
     override fun scrollToTop() {
-        binding.rvFollow.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvFollow.scrollToPosition(0)
+        }
     }
 }

+ 5 - 1
module/follow/src/main/java/com/adealink/weparty/follow/FriendListFragment.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.follow
 import android.os.Bundle
 import android.view.View
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
@@ -23,6 +24,7 @@ import com.adealink.weparty.module.follow.data.RelationItemData
 import com.adealink.weparty.module.follow.data.RelationShipType
 import com.adealink.weparty.module.follow.data.RelationUserItemData
 import com.adealink.weparty.ui.IScrollManager
+import kotlinx.coroutines.launch
 
 class FriendListFragment: BaseFragment(R.layout.fragment_friend_list), IScrollManager {
     private val binding by viewBinding(FragmentFriendListBinding::bind)
@@ -89,6 +91,8 @@ class FriendListFragment: BaseFragment(R.layout.fragment_friend_list), IScrollMa
     }
 
     override fun scrollToTop() {
-        binding.rvFollow.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvFollow.scrollToPosition(0)
+        }
     }
 }

+ 5 - 1
module/message/src/main/java/com/adealink/weparty/message/conversationlist/ConversationListFragment.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.message.conversationlist
 
 import android.os.Bundle
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.aab.util.getCompatString
@@ -36,6 +37,7 @@ import com.adealink.weparty.ui.IScrollManager
 import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.constant.RefreshState
 import com.scwang.smart.refresh.layout.simple.SimpleMultiListener
+import kotlinx.coroutines.launch
 
 @RouterUri(path = [Message.Conversation.LIST], desc = "会话列表")
 class ConversationListFragment : BaseFragment(R.layout.fragment_conversationlist),
@@ -304,6 +306,8 @@ class ConversationListFragment : BaseFragment(R.layout.fragment_conversationlist
     }
 
     override fun scrollToTop() {
-        binding.conversationList.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.conversationList.scrollToPosition(0)
+        }
     }
 }

+ 3 - 1
module/moment/src/main/java/com/adealink/weparty/moment/usermoment/square/MomentListFragment.kt

@@ -498,7 +498,9 @@ class MomentListFragment : BaseFragment(R.layout.fragment_moment_list), ReplyOpe
     }
 
     override fun scrollToTop() {
-        binding.rvMoment.smoothScrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvMoment.smoothScrollToPosition(0)
+        }
     }
 
     private fun updateMomentListFollow(uid: Long) {

+ 3 - 1
module/profile/src/main/java/com/adealink/weparty/profile/me/MeFragment.kt

@@ -532,6 +532,8 @@ class MeFragment : BaseFragment(R.layout.fragment_me), IScrollManager {
     }
 
     override fun scrollToTop() {
-        binding.scrollLayout.smoothScrollTo(0, 0)
+        lifecycleScope.launch {
+            binding.scrollLayout.smoothScrollTo(0, 0)
+        }
     }
 }

+ 5 - 1
module/room/src/main/java/com/adealink/weparty/room/roomlist/follow/FollowRoomListFragment.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.room.roomlist.follow
 
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.base.Rlt
@@ -29,6 +30,7 @@ import com.adealink.weparty.room.viewmodel.RoomViewModelFactory
 import com.adealink.weparty.ui.IScrollManager
 import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import kotlinx.coroutines.launch
 
 class FollowRoomListFragment : BaseFragment(R.layout.fragment_follow_room_list), RoomItemViewBinder.IRoomClickCallback,
     IScrollManager {
@@ -152,6 +154,8 @@ class FollowRoomListFragment : BaseFragment(R.layout.fragment_follow_room_list),
     }
 
     override fun scrollToTop() {
-        binding.rvRoomList.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvRoomList.scrollToPosition(0)
+        }
     }
 }

+ 5 - 1
module/room/src/main/java/com/adealink/weparty/room/roomlist/friends/FriendsRoomListFragment.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.room.roomlist.friends
 
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.base.Rlt
@@ -29,6 +30,7 @@ import com.adealink.weparty.room.viewmodel.RoomViewModelFactory
 import com.adealink.weparty.ui.IScrollManager
 import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import kotlinx.coroutines.launch
 
 class FriendsRoomListFragment : BaseFragment(R.layout.fragment_friends_room_list), RoomItemViewBinder.IRoomClickCallback, IScrollManager {
 
@@ -152,6 +154,8 @@ class FriendsRoomListFragment : BaseFragment(R.layout.fragment_friends_room_list
     }
 
     override fun scrollToTop() {
-        binding.rvRoomList.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvRoomList.scrollToPosition(0)
+        }
     }
 }

+ 5 - 1
module/room/src/main/java/com/adealink/weparty/room/roomlist/popular/PopularRoomListFragment.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.room.roomlist.popular
 
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.ext.isViewBindingValid
@@ -18,6 +19,7 @@ import com.adealink.weparty.room.viewmodel.RoomViewModelFactory
 import com.adealink.weparty.stat.constant.Page
 import com.adealink.weparty.stat.reportEnterPage
 import com.adealink.weparty.ui.IScrollManager
+import kotlinx.coroutines.launch
 
 class PopularRoomListFragment : BaseFragment(R.layout.fragment_popular_room_list), IScrollManager {
 
@@ -110,6 +112,8 @@ class PopularRoomListFragment : BaseFragment(R.layout.fragment_popular_room_list
     }
 
     override fun scrollToTop() {
-        binding.rvRoomList.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvRoomList.scrollToPosition(0)
+        }
     }
 }

+ 5 - 1
module/room/src/main/java/com/adealink/weparty/room/roomlist/recently/RecentlyRoomListFragment.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.room.roomlist.recently
 
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.base.Rlt
@@ -29,6 +30,7 @@ import com.adealink.weparty.room.viewmodel.RoomViewModelFactory
 import com.adealink.weparty.ui.IScrollManager
 import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import kotlinx.coroutines.launch
 
 class RecentlyRoomListFragment : BaseFragment(R.layout.fragment_recently_room_list),
     RoomItemViewBinder.IRoomClickCallback, IScrollManager {
@@ -167,6 +169,8 @@ class RecentlyRoomListFragment : BaseFragment(R.layout.fragment_recently_room_li
     }
 
     override fun scrollToTop() {
-        binding.rvRoomList.scrollToPosition(0)
+        lifecycleScope.launch {
+            binding.rvRoomList.scrollToPosition(0)
+        }
     }
 }