Browse Source

添加学生个人资料页面最近练习

Pq 2 years ago
parent
commit
5ecfae586c

+ 75 - 0
BaseLibrary/src/main/java/com/cooleshow/base/adapter/RecentPracticeAdapter.java

@@ -0,0 +1,75 @@
+package com.cooleshow.base.adapter;
+
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.R;
+import com.cooleshow.base.bean.RecentPracticeBean;
+import com.cooleshow.base.utils.MusicSheetUtils;
+import com.cooleshow.base.utils.SizeUtils;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2022/10/19.
+ */
+public class RecentPracticeAdapter extends BaseQuickAdapter<RecentPracticeBean.RowsBean, BaseViewHolder> {
+    public RecentPracticeAdapter() {
+        super(R.layout.item_recent_practice_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, RecentPracticeBean.RowsBean data) {
+        TextView tv_name=holder.getView(R.id.tv_name);
+        TextView tv_author=holder.getView(R.id.tv_author);
+        TextView tv_upload_author=holder.getView(R.id.tv_upload_author);
+        LinearLayout ll_music_subject=holder.getView(R.id.ll_music_subject);
+        ImageView iv_good_tag=holder.getView(R.id.iv_good_tag);
+        ImageView iv_album_tag=holder.getView(R.id.iv_album_tag);
+        //曲谱名称
+        if (tv_name != null) {
+            tv_name.setText(data.musicSheetName);
+        }
+        //作者
+        if (tv_author != null) {
+            tv_author.setText(String.format("-%s", data.composer));
+        }
+        //上传人
+        if (tv_upload_author != null) {
+            tv_upload_author.setText(String.format("上传者:%s", data.addName));
+        }
+
+        if (!TextUtils.isEmpty(data.subjectNames)) {
+            String[] split = data.subjectNames.split(",");
+            if (split != null && split.length > 0) {
+                for (int i = 0; i < split.length; i++) {
+                    createSubjectView(ll_music_subject,split[i]);
+                }
+            }
+        }
+
+        //精品标记
+        iv_good_tag.setVisibility(TextUtils.equals(data.exquisiteFlag, "1") ? View.VISIBLE : View.GONE);
+        //专辑曲目标记
+        MusicSheetUtils.addAlbumTag(data.albumNums,iv_album_tag);
+    }
+
+    private void createSubjectView(ViewGroup viewParent,String text) {
+        TextView textView = (TextView) LayoutInflater.from(getContext()).inflate(com.cooleshow.base.R.layout.view_subject_item_layout, viewParent, false);
+        textView.setText(text);
+        textView.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        textView.setBackgroundResource(com.cooleshow.base.R.drawable.shape_effbf9_9dp);
+        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+        if (viewParent.getChildCount() >= 1) {
+            params.setMargins(SizeUtils.dp2px(4), 0, 0, 0);
+        }
+        viewParent.addView(textView, params);
+    }
+}

+ 143 - 0
BaseLibrary/src/main/java/com/cooleshow/base/bean/RecentPracticeBean.java

@@ -0,0 +1,143 @@
+package com.cooleshow.base.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2022/10/19.
+ */
+public class RecentPracticeBean {
+
+
+    /**
+     * footer : [{"accompanimentType":"","addName":"","addUserAvatar":"","albumNums":0,"albumSortNumber":0,"audioFileUrl":"","audioType":"","auditStatus":"","auditVersion":"","canEvaluate":"","chargeType":"","composer":"","createBy":0,"createTime":"","delFlag":true,"exquisiteFlag":"","extConfigJson":"","favorite":"","favoriteCount":0,"firstPassAuditTime":"","hasBeat":"","hotFlag":"","id":0,"metronomeUrl":"","midiUrl":"","mp3Type":"","musicImg":"","musicPrice":0,"musicSheetName":"","musicSubject":"","musicTag":"","musicTagNames":"","notation":"","paymentType":"","play":"","playSpeed":0,"reason":"","remark":"","showFingering":"","sortNumber":0,"sourceType":"","state":"","subjectNames":"","submitAuditTime":"","titleImg":"","topFlag":"","updateBy":0,"updateTime":"","url":"","userId":0,"xmlFileUrl":""}]
+     * limit : 0
+     * nextPage : 0
+     * offset : 0
+     * pageNo : 0
+     * prePage : 0
+     * rows : [{"accompanimentType":"","addName":"","addUserAvatar":"","albumNums":0,"albumSortNumber":0,"audioFileUrl":"","audioType":"","auditStatus":"","auditVersion":"","canEvaluate":"","chargeType":"","composer":"","createBy":0,"createTime":"","delFlag":true,"exquisiteFlag":"","extConfigJson":"","favorite":"","favoriteCount":0,"firstPassAuditTime":"","hasBeat":"","hotFlag":"","id":0,"metronomeUrl":"","midiUrl":"","mp3Type":"","musicImg":"","musicPrice":0,"musicSheetName":"","musicSubject":"","musicTag":"","musicTagNames":"","notation":"","paymentType":"","play":"","playSpeed":0,"reason":"","remark":"","showFingering":"","sortNumber":0,"sourceType":"","state":"","subjectNames":"","submitAuditTime":"","titleImg":"","topFlag":"","updateBy":0,"updateTime":"","url":"","userId":0,"xmlFileUrl":""}]
+     * statInfo : {}
+     * total : 0
+     * totalPage : 0
+     */
+
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public List<RowsBean> rows;
+
+
+
+    public static class RowsBean implements Serializable {
+        /**
+         * accompanimentType :
+         * addName :
+         * addUserAvatar :
+         * albumNums : 0
+         * albumSortNumber : 0
+         * audioFileUrl :
+         * audioType :
+         * auditStatus :
+         * auditVersion :
+         * canEvaluate :
+         * chargeType :
+         * composer :
+         * createBy : 0
+         * createTime :
+         * delFlag : true
+         * exquisiteFlag :
+         * extConfigJson :
+         * favorite :
+         * favoriteCount : 0
+         * firstPassAuditTime :
+         * hasBeat :
+         * hotFlag :
+         * id : 0
+         * metronomeUrl :
+         * midiUrl :
+         * mp3Type :
+         * musicImg :
+         * musicPrice : 0
+         * musicSheetName :
+         * musicSubject :
+         * musicTag :
+         * musicTagNames :
+         * notation :
+         * paymentType :
+         * play :
+         * playSpeed : 0
+         * reason :
+         * remark :
+         * showFingering :
+         * sortNumber : 0
+         * sourceType :
+         * state :
+         * subjectNames :
+         * submitAuditTime :
+         * titleImg :
+         * topFlag :
+         * updateBy : 0
+         * updateTime :
+         * url :
+         * userId : 0
+         * xmlFileUrl :
+         */
+
+        public String accompanimentType;
+        public String addName;
+        public String addUserAvatar;
+        public int albumNums;
+        public int albumSortNumber;
+        public String audioFileUrl;
+        public String audioType;
+        public String auditStatus;
+        public String auditVersion;
+        public String canEvaluate;
+        public String chargeType;
+        public String composer;
+        public int createBy;
+        public String createTime;
+        public boolean delFlag;
+        public String exquisiteFlag;
+        public String extConfigJson;
+        public String favorite;
+        public int favoriteCount;
+        public String firstPassAuditTime;
+        public String hasBeat;
+        public String hotFlag;
+        public int id;
+        public String metronomeUrl;
+        public String midiUrl;
+        public String mp3Type;
+        public String musicImg;
+        public int musicPrice;
+        public String musicSheetName;
+        public String musicSubject;
+        public String musicTag;
+        public String musicTagNames;
+        public String notation;
+        public String paymentType;
+        public String play;
+        public int playSpeed;
+        public String reason;
+        public String remark;
+        public String showFingering;
+        public int sortNumber;
+        public String sourceType;
+        public String state;
+        public String subjectNames;
+        public String submitAuditTime;
+        public String titleImg;
+        public String topFlag;
+        public int updateBy;
+        public String updateTime;
+        public String url;
+        public int userId;
+        public String xmlFileUrl;
+    }
+}

+ 3 - 0
BaseLibrary/src/main/java/com/cooleshow/base/contract/UserDetailContract.java

@@ -1,5 +1,6 @@
 package com.cooleshow.base.contract;
 
+import com.cooleshow.base.bean.RecentPracticeBean;
 import com.cooleshow.base.bean.UserDetailInfoBean;
 import com.cooleshow.base.presenter.view.BaseView;
 
@@ -12,6 +13,8 @@ import com.cooleshow.base.presenter.view.BaseView;
 public interface UserDetailContract {
     interface UserDetailView extends BaseView {
         void getUserDetailSuccess(UserDetailInfoBean infoBean);
+
+        void getRecentPracticeSuccess(RecentPracticeBean practiceBean);
     }
     interface Presenter {
     }

+ 18 - 0
BaseLibrary/src/main/java/com/cooleshow/base/data/api/UploadApi.java

@@ -1,6 +1,7 @@
 package com.cooleshow.base.data.api;
 
 import com.cooleshow.base.bean.AddressBean;
+import com.cooleshow.base.bean.RecentPracticeBean;
 import com.cooleshow.base.bean.UploadTokenInfoBean;
 import com.cooleshow.base.bean.UserDetailInfoBean;
 import com.cooleshow.base.bean.request.EditAddressEntry;
@@ -106,4 +107,21 @@ public interface UploadApi {
      */
     @GET(TEACHER_GROUP + "student/queryUserById")
     Observable<BaseResponse<UserDetailInfoBean>> queryStuDetailFromTeacher(@Query("rongCloudUserId") String userId);
+
+    /**
+     * 查询学生最近练习
+     *
+     * @param userId
+     * @return
+     */
+    @GET(STUDENT_GROUP + "music/sheet/user/practice")
+    Observable<BaseResponse<RecentPracticeBean>> queryStuRecentPractice(@Query("userId") String userId);
+    /**
+     * 查询学生最近练习
+     *
+     * @param userId
+     * @return
+     */
+    @GET(TEACHER_GROUP + "music/sheet/user/practice")
+    Observable<BaseResponse<RecentPracticeBean>> queryStuRecentPracticeFromTeacher(@Query("userId") String userId);
 }

+ 31 - 0
BaseLibrary/src/main/java/com/cooleshow/base/presenter/UserDetailPresenter.java

@@ -1,5 +1,6 @@
 package com.cooleshow.base.presenter;
 
+import com.cooleshow.base.bean.RecentPracticeBean;
 import com.cooleshow.base.bean.UserDetailInfoBean;
 import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.constanst.ScanContract;
@@ -45,4 +46,34 @@ public class UserDetailPresenter extends BasePresenter<UserDetailContract.UserDe
             });
         }
     }
+
+    /**
+     * 获取最近练习数据
+     * @param userId
+     */
+    public void getUserRecentPractice(String userId) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        //根据用户编号获取用户基本信息
+        if (BaseApplication.Companion.isTeacherClient()) {
+            addSubscribe(create(UploadApi.class).queryStuRecentPracticeFromTeacher(userId), new BaseObserver<RecentPracticeBean>(getView()) {
+                @Override
+                protected void onSuccess(RecentPracticeBean data) {
+                    if (getView() != null) {
+                        getView().getRecentPracticeSuccess(data);
+                    }
+                }
+            });
+        } else {
+            addSubscribe(create(UploadApi.class).queryStuRecentPractice(userId), new BaseObserver<RecentPracticeBean>(getView()) {
+                @Override
+                protected void onSuccess(RecentPracticeBean data) {
+                    if (getView() != null) {
+                        getView().getRecentPracticeSuccess(data);
+                    }
+                }
+            });
+        }
+    }
 }

+ 36 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/userInfo/StudentUserInfoDetailActivity.java

@@ -1,9 +1,13 @@
 package com.cooleshow.base.ui.activity.userInfo;
 
+import android.graphics.Color;
+import android.os.Bundle;
 import android.text.TextUtils;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.cooleshow.base.R;
+import com.cooleshow.base.adapter.RecentPracticeAdapter;
+import com.cooleshow.base.bean.RecentPracticeBean;
 import com.cooleshow.base.bean.UserDetailInfoBean;
 import com.cooleshow.base.contract.UserDetailContract;
 import com.cooleshow.base.databinding.ActivityUserInfoDetailLayoutBinding;
@@ -11,6 +15,11 @@ import com.cooleshow.base.presenter.UserDetailPresenter;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
 
 /**
  * Author by pq, Date on 2022/10/18.
@@ -20,15 +29,30 @@ import com.cooleshow.base.utils.GlideUtils;
 public class StudentUserInfoDetailActivity extends BaseMVPActivity<ActivityUserInfoDetailLayoutBinding, UserDetailPresenter> implements UserDetailContract.UserDetailView {
 
     private String mTargetUserId;
+    private RecentPracticeAdapter mAdapter;
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
 
     @Override
     protected void initView() {
+        viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "");
         mTargetUserId = getIntent().getStringExtra("targetUserId");
         if (TextUtils.isEmpty(mTargetUserId)) {
             finish();
             return;
         }
+        mAdapter = new RecentPracticeAdapter();
+        viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(this);
+        emptyViewLayout.setContent(R.drawable.icon_empty_content, "暂无内容");
+        mAdapter.setEmptyView(emptyViewLayout);
+        viewBinding.recyclerView.setAdapter(mAdapter);
     }
 
     @Override
@@ -64,5 +88,17 @@ public class StudentUserInfoDetailActivity extends BaseMVPActivity<ActivityUserI
         viewBinding.tvGenderValue.setText(TextUtils.equals(infoBean.gender, "1") ? "男" : "女");
         //声部
         viewBinding.tvMusicSubjectValue.setText(infoBean.subjectName);
+        //查询最近练习数据
+        presenter.getUserRecentPractice(infoBean.userId);
+    }
+
+    @Override
+    public void getRecentPracticeSuccess(RecentPracticeBean practiceBean) {
+        if (!checkActivityExist() || practiceBean == null) {
+            return;
+        }
+        if (mAdapter != null) {
+            mAdapter.setNewInstance(practiceBean.rows);
+        }
     }
 }

BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_music_is_album_tag.png


BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_music_sheet_play.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_music_is_album_tag.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_music_sheet_play.png


+ 1 - 1
BaseLibrary/src/main/res/layout/activity_user_info_detail_layout.xml

@@ -15,7 +15,7 @@
 
     <include
         android:id="@+id/toolbar_include"
-        layout="@layout/common_toolbar_layout_white" />
+        layout="@layout/common_toolbar_layout" />
 
 
     <View

+ 128 - 0
BaseLibrary/src/main/res/layout/item_recent_practice_layout.xml

@@ -0,0 +1,128 @@
+<?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:paddingStart="11dp"
+    android:paddingEnd="11dp">
+
+    <LinearLayout
+        android:id="@+id/ll_tag_container"
+        android:layout_width="wrap_content"
+        android:layout_height="17dp"
+        android:layout_marginTop="17dp"
+        android:orientation="horizontal"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_good_tag"
+        android:layout_width="14dp"
+        android:layout_height="17dp"
+        android:layout_marginStart="5dp"
+        android:src="@drawable/icon_home_good_music_sheet_tag"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/ll_tag_container"
+        app:layout_constraintLeft_toRightOf="@+id/ll_tag_container"
+        app:layout_constraintTop_toTopOf="@+id/ll_tag_container" />
+
+
+    <ImageView
+        android:visibility="gone"
+        android:id="@+id/iv_album_tag"
+        android:layout_marginStart="5dp"
+        app:layout_constraintBottom_toBottomOf="@+id/ll_tag_container"
+        app:layout_constraintTop_toTopOf="@+id/ll_tag_container"
+        app:layout_constraintLeft_toRightOf="@+id/iv_good_tag"
+        android:src="@drawable/icon_music_is_album_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:lines="1"
+        android:paddingStart="6dp"
+        android:textColor="@color/color_1a1a1a"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintWidth_default="wrap"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintBottom_toBottomOf="@+id/ll_tag_container"
+        app:layout_constraintLeft_toRightOf="@+id/iv_album_tag"
+        app:layout_constraintRight_toLeftOf="@+id/tv_author"
+        app:layout_constraintTop_toTopOf="@+id/ll_tag_container"
+        tools:text="维瓦尔第 E第一维瓦尔第维瓦尔第维瓦尔第" />
+
+    <TextView
+        android:maxLines="1"
+        android:id="@+id/tv_author"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:paddingStart="6dp"
+        android:maxLength="6"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintRight_toLeftOf="@+id/iv_play"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_name"
+        app:layout_constraintLeft_toRightOf="@+id/tv_name"
+        app:layout_constraintTop_toTopOf="@+id/tv_name"
+        tools:text="-维瓦尔第…维瓦尔第维瓦尔第" />
+
+    <ImageView
+        android:id="@+id/iv_play"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="14dp"
+        android:src="@drawable/icon_music_sheet_play"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+    <TextView
+        android:id="@+id/tv_upload_author"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="12dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintWidth_default="wrap"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintRight_toLeftOf="@+id/ll_music_subject"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="@+id/ll_tag_container"
+        app:layout_constraintTop_toBottomOf="@+id/ll_tag_container"
+        tools:text="上传者:一把剑走天涯一把剑走天涯一把剑走天涯一把剑走天涯一把剑走天涯" />
+
+    <LinearLayout
+        android:layout_marginEnd="5dp"
+        android:layout_marginStart="12dp"
+        android:id="@+id/ll_music_subject"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_upload_author"
+        app:layout_constraintLeft_toRightOf="@+id/tv_upload_author"
+        app:layout_constraintRight_toLeftOf="@+id/iv_play"
+        app:layout_constraintTop_toTopOf="@+id/tv_upload_author" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_marginTop="15dp"
+        android:background="@color/color_e8e8e8"
+        app:layout_constraintTop_toBottomOf="@+id/tv_upload_author" />
+</androidx.constraintlayout.widget.ConstraintLayout>