Procházet zdrojové kódy

添加学生端老师端首页消息双击滚动至未读消息位置

Pq před 2 roky
rodič
revize
220a59484b

+ 22 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/TopSmoothScroller.java

@@ -0,0 +1,22 @@
+package com.cooleshow.base.widgets;
+
+import android.content.Context;
+
+import androidx.recyclerview.widget.LinearSmoothScroller;
+
+/**
+ * Author by pq, Date on 2022/11/11.
+ */
+public class TopSmoothScroller extends LinearSmoothScroller {
+    public TopSmoothScroller(Context context) {
+        super(context);
+    }
+    @Override
+    protected int getHorizontalSnapPreference() {
+        return SNAP_TO_START;//具体见源码注释
+    }
+    @Override
+    protected int getVerticalSnapPreference() {
+        return SNAP_TO_START;//具体见源码注释
+    }
+}

+ 9 - 2
rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java

@@ -55,6 +55,7 @@ import io.rong.imlib.model.UserInfo;
 public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBinding, MessagePresenter> implements MessageFragmentContract.MessageFragmentView, View.OnClickListener {
     public static final String[] titles = new String[]{"聊天", "联系人"};
     private ArrayList<Fragment> fragments = new ArrayList<>();
+    private ConversationListFragment mConversationListFragment;
 
     @Override
     protected void initView(View rootView) {
@@ -181,11 +182,11 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
             }
         });
 
-        ConversationListFragment conversationListFragment = new ConversationListFragment();
+        mConversationListFragment = new ConversationListFragment();
 //        ContactPersonListFragment contactPersonListFragment = new ContactPersonListFragment();
         ContactListTabFragment contactListTabFragment = new ContactListTabFragment();
 
-        fragments.add(conversationListFragment);
+        fragments.add(mConversationListFragment);
         fragments.add(contactListTabFragment);
         MessagePagerAdapter messagePagerAdapter = new MessagePagerAdapter(this);
         messagePagerAdapter.setData(fragments);
@@ -247,6 +248,12 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
         }
     }
 
+    public void onFindConversationUnRead() {
+        if (mConversationListFragment != null) {
+            mConversationListFragment.findUnReadConversation();
+        }
+    }
+
     private UserInfo buildCurrentUserInfo(String userId) {
         Uri avatarUri = Uri.parse(UserHelper.getUserAvatar());
         UserInfo userInfo = new UserInfo(userId, UserHelper.getUserName(), avatarUri);

+ 57 - 8
rong_im/kit/src/main/java/io/rong/imkit/conversationlist/ConversationListFragment.java

@@ -5,6 +5,7 @@ import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -17,6 +18,7 @@ import com.cooleshow.base.constanst.LoginStatusConstants;
 import com.cooleshow.base.event.LoginStatusEvent;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.widgets.TopSmoothScroller;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -76,11 +78,14 @@ public class ConversationListFragment extends Fragment implements BaseAdapter.On
     private ConversationListViewModel mConversationListViewModel;
     protected SmartRefreshLayout mRefreshLayout;
     protected Handler mHandler = new Handler(Looper.getMainLooper());
+    private LinearLayoutManager mLayoutManager;
 
     {
         mAdapter = onResolveAdapter();
     }
 
+    private int targetUnReadPos = -1;//未读会话位置标记
+
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -101,8 +106,8 @@ public class ConversationListFragment extends Fragment implements BaseAdapter.On
         mRefreshLayout = view.findViewById(R.id.rc_refresh);
 
         mAdapter.setItemClickListener(this);
-        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
-        mList.setLayoutManager(layoutManager);
+        mLayoutManager = new LinearLayoutManager(getActivity());
+        mList.setLayoutManager(mLayoutManager);
         mList.setAdapter(mAdapter);
 
         mNoticeContainerView = view.findViewById(R.id.rc_conversationlist_notice_container);
@@ -142,12 +147,12 @@ public class ConversationListFragment extends Fragment implements BaseAdapter.On
                 onConversationListRefresh(refreshLayout);
             }
         });
-        mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
-            @Override
-            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
-                onConversationListLoadMore();
-            }
-        });
+//        mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
+//            @Override
+//            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
+//                onConversationListLoadMore();
+//            }
+//        });
 
 
     }
@@ -188,6 +193,7 @@ public class ConversationListFragment extends Fragment implements BaseAdapter.On
             @Override
             public void onChanged(List<BaseUiConversation> uiConversations) {
                 RLog.d(TAG, "conversation list onChanged.");
+                targetUnReadPos = -1;
                 mAdapter.setDataCollection(uiConversations);
             }
         });
@@ -229,6 +235,49 @@ public class ConversationListFragment extends Fragment implements BaseAdapter.On
 
     }
 
+    public void findUnReadConversation() {
+        List<BaseUiConversation> data = mAdapter.getData();
+        if (data != null && data.size() > 0) {
+            int firstUnreadPos = -1;
+            for (int i = 0; i < data.size(); i++) {
+                BaseUiConversation baseUiConversation = data.get(i);
+                if (baseUiConversation.mCore != null) {
+                    int unreadMessageCount = baseUiConversation.mCore.getUnreadMessageCount();
+                    if (unreadMessageCount != 0) {
+                        if (firstUnreadPos == -1) {
+                            firstUnreadPos = i;
+                        }
+                        if (i != targetUnReadPos && i > targetUnReadPos) {
+                            targetUnReadPos = i;
+                            break;
+                        }
+                    } else {
+                        if (i == data.size() - 1) {
+                            //如果遍历到最后一条,就返回第一条未读会话的位置
+                            targetUnReadPos = firstUnreadPos;
+                        }
+                    }
+                }
+            }
+        }
+        scrollToPosition(targetUnReadPos);
+    }
+
+    private void scrollToPosition(int pos) {
+        if (mLayoutManager != null) {
+            List<BaseUiConversation> data = mAdapter.getData();
+            if (data != null && data.size() > 0) {
+                if (pos < 0 || pos >= data.size()) {
+                    pos = 0;
+                }
+                Log.i("pq", "result pos:" + pos);
+                final TopSmoothScroller mScroller = new TopSmoothScroller(getActivity());
+                mScroller.setTargetPosition(pos);
+                mLayoutManager.startSmoothScroll(mScroller);
+            }
+        }
+    }
+
     /**
      * 会话列表点击事件回调
      *

+ 2 - 2
rong_im/kit/src/main/java/io/rong/imkit/conversationlist/viewmodel/ConversationListViewModel.java

@@ -158,7 +158,7 @@ public class ConversationListViewModel extends AndroidViewModel {
                 if (loadMore) {
                     timestamp = mLastSyncTime;
                 }
-                RongIMClient.getInstance().getConversationListByPage(new RongIMClient.ResultCallback<List<Conversation>>() {
+                RongIMClient.getInstance().getConversationList(new RongIMClient.ResultCallback<List<Conversation>>() {
                     @Override
                     public void onSuccess(List<Conversation> conversations) {
                         if (loadMore) {
@@ -215,7 +215,7 @@ public class ConversationListViewModel extends AndroidViewModel {
                             mRefreshEventLiveData.postValue(new Event.RefreshEvent(RefreshState.RefreshFinish));
                         }
                     }
-                }, timestamp, mSizePerPage, mSupportedTypes);
+                }, mSupportedTypes);
             }
         }, REFRESH_INTERVAL);
 

+ 1 - 0
rong_im/kit/src/main/res/layout/rc_conversationlist_fragment.xml

@@ -72,6 +72,7 @@
 
 
     <io.rong.imkit.widget.refresh.SmartRefreshLayout
+        app:srlEnableLoadMore="false"
         android:id="@+id/rc_refresh"
         android:layout_width="match_parent"
         android:layout_height="match_parent"

+ 11 - 2
student/src/main/java/com/cooleshow/student/ui/main/MainActivity.java

@@ -31,6 +31,7 @@ import com.cooleshow.base.utils.GsonUtils;
 import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
 import com.cooleshow.base.utils.helper.MidiFileHelper;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.base.utils.helper.UpdateAppHelper;
@@ -92,6 +93,7 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
     private long lastTime = 0;
     private boolean isNeedSetPushId = true;
     private String floatViewEventUrl = "";
+    private MessageFragment mMessageFragment;
 
     /**
      * 打开首页并选中指定tab
@@ -161,12 +163,12 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
         mHomeFragment = new HomeFragment();
         NewHomeFragment newHomeFragment = new NewHomeFragment();
         CourseTableFragment courseTableFragment = new CourseTableFragment();
-        MessageFragment messageFragment = new MessageFragment();
+        mMessageFragment = new MessageFragment();
         shopMallFragment = new MallFragment();
         mMineFragment = new MineFragment();
         mFragments.add(newHomeFragment);
         mFragments.add(courseTableFragment);
-        mFragments.add(messageFragment);
+        mFragments.add(mMessageFragment);
         mFragments.add(shopMallFragment);
         mFragments.add(mMineFragment);
         homePageAdapter.setFragments(mFragments);
@@ -295,6 +297,13 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
             return;
         }
         if (id == R.id.view_chat) {
+            if (UiUtils.isFastClick(200)) {
+                //双击操作
+                if (mMessageFragment != null) {
+                    mMessageFragment.onFindConversationUnRead();
+                }
+                return;
+            }
             getViewBinding().viewPager.setCurrentItem(2, false);
             handleTabAnim(viewBinding.tabChat);
             setTabTextStyle(viewBinding.tvChat);

+ 11 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/main/MainActivity.java

@@ -26,6 +26,7 @@ import com.cooleshow.base.utils.GsonUtils;
 import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
 import com.cooleshow.base.utils.helper.MidiFileHelper;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.base.utils.helper.UpdateAppHelper;
@@ -88,6 +89,7 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
     private long lastTime = 0;
     private boolean isNeedSetPushId = true;
     private String floatViewEventUrl = "";
+    private MessageFragment mMessageFragment;
 
     /**
      * 打开首页并选中指定tab
@@ -160,13 +162,13 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
         HomePageAdapter homePageAdapter = new HomePageAdapter(this);
 //        mHomeFragment = new HomeFragment();
         CourseTableFragment courseTableFragment = new CourseTableFragment();
-        MessageFragment messageFragment = new MessageFragment();
+        mMessageFragment = new MessageFragment();
         shopMallFragment = new MallFragment();
         mMineFragment = new MineFragment();
         mHomeFragment = new NewHomeFragment();
         mFragments.add(mHomeFragment);
         mFragments.add(courseTableFragment);
-        mFragments.add(messageFragment);
+        mFragments.add(mMessageFragment);
         mFragments.add(shopMallFragment);
         mFragments.add(mMineFragment);
         homePageAdapter.setFragments(mFragments);
@@ -294,6 +296,13 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
             return;
         }
         if (id == R.id.view_chat) {
+            if (UiUtils.isFastClick(200)) {
+                //双击操作
+                if (mMessageFragment != null) {
+                    mMessageFragment.onFindConversationUnRead();
+                }
+                return;
+            }
             lastCurrentItemPosition = 2;
             getViewBinding().viewPager.setCurrentItem(2, false);
             handleTabAnim(viewBinding.tabChat);