Selaa lähdekoodia

添加联系人列表页面

Pq 3 vuotta sitten
vanhempi
commit
d82b2fd674

+ 2 - 0
BaseLibrary/build.gradle

@@ -134,4 +134,6 @@ dependencies {
     api 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0'
 
     api "com.github.tbruyelle:rxpermissions:0.12"
+
+    api 'com.github.mcxtzhang:SuspensionIndexBar:V1.0.0'
 }

+ 2 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/EmptyViewLayout.java

@@ -2,6 +2,7 @@ package com.cooleshow.base.widgets;
 
 import android.content.Context;
 import android.util.AttributeSet;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
@@ -35,6 +36,7 @@ public class EmptyViewLayout extends LinearLayout {
 
     private void init() {
         setOrientation(VERTICAL);
+        setGravity(Gravity.CENTER);
         LayoutInflater.from(getContext()).inflate(R.layout.empty_layout, this);
         mIvEmptyIcon = findViewById(R.id.iv_empty_icon);
         mTvEmptyTip = findViewById(R.id.tv_empty_tip);

+ 1 - 0
BaseLibrary/src/main/res/values/colors.xml

@@ -29,6 +29,7 @@
 
     <color name="divide_color">#FFEBEBEB</color>
     <color name="divide_color2">#FFF2F2F2</color>
+    <color name="divide_color_f0f0f0">#f0f0f0</color>
     <color name="color_ff2dc7aa">#FF2DC7AA</color>
     <color name="color_fff5f7fb">#FFF5F7FB</color>
     <color name="color_ffc1c1c1">#FFC1C1C1</color>

+ 29 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/ContactListAdapter.java

@@ -0,0 +1,29 @@
+package com.common.im.adapter;
+
+import android.view.View;
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.ContactListBean;
+import com.common.im_ui.R;
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.base.utils.GlideUtils;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2022/5/7.
+ */
+public class ContactListAdapter extends BaseQuickAdapter<ContactListBean, BaseViewHolder> {
+    public ContactListAdapter(int layoutResId) {
+        super(layoutResId);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, ContactListBean contactListBean) {
+        holder.setText(R.id.tv_name, contactListBean.friendNickname);
+        ImageView iv_icon = holder.getView(R.id.iv_icon);
+        GlideUtils.INSTANCE.loadImage(getContext(), contactListBean.friendAvatar, iv_icon);
+    }
+}

+ 27 - 0
rong_im/common_im_ui/src/main/java/com/common/im/api/IMApi.java

@@ -0,0 +1,27 @@
+package com.common.im.api;
+
+import com.common.im.bean.ContactListBean;
+import com.cooleshow.base.common.BaseConstant;
+import com.cooleshow.base.data.net.BaseResponse;
+
+import java.util.List;
+
+import io.reactivex.rxjava3.core.Observable;
+import okhttp3.RequestBody;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * Author by pq, Date on 2022/5/7.
+ */
+public interface IMApi {
+    /**
+     * 获取好友列表
+     *
+     * @return
+     */
+    @POST(BaseConstant.TEACHER_GROUP + "imUserFriend/queryAll")
+    Observable<BaseResponse<List<ContactListBean>>> queryFriendList(@Body RequestBody requestBody);
+}

+ 48 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/ContactListBean.java

@@ -0,0 +1,48 @@
+package com.common.im.bean;
+
+import android.text.TextUtils;
+
+import com.mcxtzhang.indexlib.IndexBar.bean.BaseIndexPinyinBean;
+
+/**
+ * Description:
+ * Copyright  : Copyright (c) 2019
+ * Company    : 大雅乐盟
+ * Author     : r
+ * Date       : 2019/10/3 10:42
+ */
+public class ContactListBean extends BaseIndexPinyinBean {
+
+    /**
+     * createTime :
+     * friendAvatar :
+     * friendId : 0
+     * friendNickname :
+     * id : 0
+     * memo :
+     * updateTime :
+     * userId : 0
+     */
+
+    public String createTime;
+    public String friendAvatar;
+    public int friendId;
+    public String friendNickname;
+    public int id;
+    public String memo;
+    public String updateTime;
+    public int userId;
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String getTarget() {
+        return TextUtils.isEmpty(friendNickname) ? "#" : friendNickname;
+    }
+}

+ 20 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactListFragmentContract.java

@@ -0,0 +1,20 @@
+package com.common.im.contract;
+
+import com.common.im.bean.ContactListBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface ContactListFragmentContract {
+
+    interface ContactListFragmentView extends BaseView {
+        void getFriendListSuccess(List<ContactListBean> contactListBeans);
+    }
+
+    interface Presenter {
+        void queryFriendList(String searchCondition);
+    }
+}

+ 44 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactListPresenter.java

@@ -0,0 +1,44 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.bean.ContactListBean;
+import com.common.im.contract.ContactListFragmentContract;
+import com.common.im.contract.MessageFragmentContract;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/5/6.
+ */
+public class ContactListPresenter extends BasePresenter<ContactListFragmentContract.ContactListFragmentView> implements ContactListFragmentContract.Presenter {
+
+    @Override
+    public void queryFriendList(String searchCondition) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("search", searchCondition);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).queryFriendList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<ContactListBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<ContactListBean> data) {
+                if (getView() != null) {
+                    getView().getFriendListSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
+        });
+    }
+}

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

@@ -8,6 +8,7 @@ import android.widget.TextView;
 import com.common.im.adapter.MessagePagerAdapter;
 import com.common.im.contract.MessageFragmentContract;
 import com.common.im.presenter.MessagePresenter;
+import com.common.im.ui.contact.ContactPersonListFragment;
 import com.common.im_ui.R;
 import com.common.im_ui.databinding.FragmentMessageLayoutBinding;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
@@ -64,9 +65,9 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
             }
         });
         ConversationListFragment conversationListFragment = new ConversationListFragment();
-        ConversationListFragment conversationListFragment2 = new ConversationListFragment();
+        ContactPersonListFragment contactPersonListFragment = new ContactPersonListFragment();
         fragments.add(conversationListFragment);
-        fragments.add(conversationListFragment2);
+        fragments.add(contactPersonListFragment);
         MessagePagerAdapter messagePagerAdapter = new MessagePagerAdapter(this);
         messagePagerAdapter.setData(fragments);
         mViewBinding.viewPager.setAdapter(messagePagerAdapter);

+ 106 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactPersonListFragment.java

@@ -0,0 +1,106 @@
+package com.common.im.ui.contact;
+
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+
+import com.common.im.adapter.ContactListAdapter;
+import com.common.im.bean.ContactListBean;
+import com.common.im.contract.ContactListFragmentContract;
+import com.common.im.presenter.ContactListPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.FragmentContactListLayoutBinding;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.mcxtzhang.indexlib.suspension.SuspensionDecoration;
+
+import java.text.CollationKey;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import io.rong.imkit.RongIM;
+import io.rong.imlib.model.Conversation;
+
+/**
+ * 联系人列表
+ */
+public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactListLayoutBinding, ContactListPresenter> implements ContactListFragmentContract.ContactListFragmentView {
+
+    private SuspensionDecoration mDecoration;
+    private List<ContactListBean> mDatas = new ArrayList<>();
+    private ContactListAdapter mListAdapter;
+    private String searchCondition;
+    private EmptyViewLayout mEmptyViewLayout;
+
+    @Override
+    protected FragmentContactListLayoutBinding getLayoutView() {
+        return FragmentContactListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ContactListPresenter createPresenter() {
+        return new ContactListPresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+        mListAdapter = new ContactListAdapter(R.layout.item_contact_list_layout);
+        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
+        mViewBinding.recyclerView.setLayoutManager(layoutManager);
+        mDecoration = new SuspensionDecoration(getContext(), mDatas);
+        mDecoration.setColorTitleBg(Color.TRANSPARENT);
+        mDecoration.setmTitleHeight(SizeUtils.dp2px(30));
+        mViewBinding.recyclerView.addItemDecoration(mDecoration);
+        mViewBinding.livLetters.setmPressedShowTextView(mViewBinding.tvHint)//设置HintTextView
+                .setNeedRealIndex(false)//设置需要真实的索引
+                .setmLayoutManager(layoutManager);//设置RecyclerView的LayoutManager
+        mViewBinding.recyclerView.setAdapter(mListAdapter);
+    }
+
+    @Override
+    protected void initData() {
+        presenter.queryFriendList(searchCondition);
+    }
+
+    @Override
+    public void getFriendListSuccess(List<ContactListBean> contactListBeans) {
+        if (isDetached()) {
+            return;
+        }
+        if (mListAdapter != null) {
+            if (contactListBeans != null && contactListBeans.size() > 0) {
+                mDatas = contactListBeans;
+                mDecoration.setmDatas(mDatas);
+                mViewBinding.livLetters.setmSourceDatas(mDatas)//设置数据
+                        .invalidate();
+                mListAdapter.setNewInstance(contactListBeans);
+            } else {
+                showEmptyView();
+            }
+        }
+    }
+
+    private void showEmptyView() {
+        if (mEmptyViewLayout == null) {
+            mEmptyViewLayout = new EmptyViewLayout(getContext());
+        }
+        mEmptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_content, "暂无联系人");
+        mListAdapter.setEmptyView(mEmptyViewLayout);
+    }
+}

BIN
rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_add_contact.png


BIN
rong_im/common_im_ui/src/main/res/drawable-xxhdpi/ic_teacher_screen.png


BIN
rong_im/common_im_ui/src/main/res/drawable-xxhdpi/icon_add_contact.png


+ 120 - 0
rong_im/common_im_ui/src/main/res/layout/fragment_contact_list_layout.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout 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">
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="match_parent"
+        android:layout_height="35dp"
+        android:layout_marginStart="14dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_18dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <EditText
+        android:id="@+id/et_target_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:ellipsize="end"
+        android:hint="请输入学员名称"
+        android:maxLines="1"
+        android:paddingStart="8dp"
+        android:textColor="@color/color_333333"
+        android:textColorHint="@color/color_999999"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="56dp"
+        android:layout_height="28dp"
+        android:layout_marginEnd="4dp"
+        android:background="@drawable/shape_1ecdac_18dp"
+        android:gravity="center"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginTop="@dimen/dp_10"
+        android:scrollbars="none"
+        android:overScrollMode="never"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/liv_letters"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/view_search_bg"
+        app:layout_constraintVertical_bias="0.0"/>
+
+    <com.mcxtzhang.indexlib.IndexBar.widget.IndexBar
+        android:id="@+id/liv_letters"
+        android:layout_width="@dimen/dp_20"
+        android:layout_height="0dp"
+        android:layout_marginTop="@dimen/dp_65"
+        android:layout_marginBottom="@dimen/dp_20"
+        android:paddingRight="@dimen/dp_10"
+        app:indexBarPressBackground="@color/white"
+        app:indexBarTextSize="@dimen/dp_12"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/recyclerView"
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintVertical_bias="0.0"/>
+
+    <Space
+        android:id="@+id/spacer"
+        android:layout_width="@dimen/dp_58"
+        android:layout_height="@dimen/dp_58"
+        android:layout_marginEnd="@dimen/dp_5"
+        android:gravity="center"
+        android:paddingStart="8dp"
+        android:paddingBottom="@dimen/dp_3"
+        android:text="A"
+        android:textColor="@color/white"
+        android:textSize="@dimen/dp_45"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@id/liv_letters"
+        app:layout_constraintEnd_toEndOf="@+id/recyclerView"/>
+
+    <TextView
+        android:id="@+id/tv_hint"
+        android:layout_width="@dimen/dp_58"
+        android:layout_height="@dimen/dp_58"
+        android:layout_marginTop="@dimen/dp_54"
+        android:background="@drawable/ic_teacher_screen"
+        android:gravity="center"
+        android:paddingStart="8dp"
+        android:paddingBottom="@dimen/dp_3"
+        android:text="A"
+        android:textColor="@color/white"
+        android:textSize="@dimen/dp_45"
+        android:textStyle="bold"
+        android:visibility="invisible"
+        app:layout_constraintEnd_toEndOf="@+id/spacer"
+        app:layout_constraintTop_toTopOf="@id/spacer"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 40 - 0
rong_im/common_im_ui/src/main/res/layout/item_contact_list_layout.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/white"
+    android:paddingStart="@dimen/dp_14">
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:id="@+id/iv_icon"
+        android:layout_marginTop="12dp"
+        android:layout_marginBottom="12dp"
+        android:layout_width="@dimen/dp_44"
+        android:layout_height="@dimen/dp_44"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:qmui_corner_radius="6dp" />
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:layout_marginStart="11dp"
+        android:textColor="@color/color_1a1a1a"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon"
+        tools:text="哈喽王" />
+
+    <View
+        android:background="@color/divide_color_f0f0f0"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_name"
+        android:layout_width="0dp"
+        android:layout_height="1px"/>
+</androidx.constraintlayout.widget.ConstraintLayout>