Sfoglia il codice sorgente

增加小组课课程组详情页面

Pq 3 mesi fa
parent
commit
432bbbfecc
29 ha cambiato i file con 2235 aggiunte e 19 eliminazioni
  1. 18 0
      BaseLibrary/src/main/java/com/cooleshow/base/bean/CommonCourseConfigBean.java
  2. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  3. 6 1
      BaseLibrary/src/main/java/com/cooleshow/base/utils/StringUtils.java
  4. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_group_course_avatar.png
  5. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_group_course_avatar.png
  6. 7 0
      BaseLibrary/src/main/res/drawable/bg_white_4dp.xml
  7. 5 0
      classRoom/src/main/res/drawable/shape_f8f8f8_6dp.xml
  8. 6 0
      teacher/src/main/AndroidManifest.xml
  9. 94 0
      teacher/src/main/java/com/cooleshow/teacher/adapter/GroupCourseGroupCourseListAdapter.java
  10. 52 0
      teacher/src/main/java/com/cooleshow/teacher/adapter/GroupCourseGroupStudentListAdapter.java
  11. 4 0
      teacher/src/main/java/com/cooleshow/teacher/adapter/PianoCourseGroupStudentListAdapter.java
  12. 10 0
      teacher/src/main/java/com/cooleshow/teacher/api/APIService.java
  13. 291 0
      teacher/src/main/java/com/cooleshow/teacher/bean/GroupCourseGroupDetailBean.java
  14. 3 3
      teacher/src/main/java/com/cooleshow/teacher/bean/LiveCourseListBean.java
  15. 9 0
      teacher/src/main/java/com/cooleshow/teacher/bean/VIPCourseGroupDetailListBean.java
  16. 33 0
      teacher/src/main/java/com/cooleshow/teacher/contract/GroupCourseGroupDetailContract.java
  17. 122 0
      teacher/src/main/java/com/cooleshow/teacher/presenter/course/GroupCourseGroupDetailPresenter.java
  18. 311 0
      teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupDetailActivity.java
  19. 363 0
      teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupDetailFragment.java
  20. 71 0
      teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupDetailStudentFragment.java
  21. 3 4
      teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupFragment.java
  22. 0 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoCourseGroupDetailActivity.java
  23. 2 2
      teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoCourseGroupDetailFragment.java
  24. 413 0
      teacher/src/main/res/layout/ac_group_course_group_detail_layout.xml
  25. 117 0
      teacher/src/main/res/layout/fg_group_course_group_detail_layout.xml
  26. 13 0
      teacher/src/main/res/layout/fg_group_course_group_detail_student_list_layout.xml
  27. 9 8
      teacher/src/main/res/layout/fg_piano_course_group_detail_layout.xml
  28. 197 0
      teacher/src/main/res/layout/item_group_course_group_course_layout.xml
  29. 75 0
      teacher/src/main/res/layout/item_group_course_group_student_layout.xml

+ 18 - 0
BaseLibrary/src/main/java/com/cooleshow/base/bean/CommonCourseConfigBean.java

@@ -22,6 +22,24 @@ public class CommonCourseConfigBean {
     private String pianoStartTime;
     private String vipStartTime;
     private String vipEndTime;
+    private String groupStartTime;
+    private String groupEndTime;
+
+    public String getGroupStartTime() {
+        return groupStartTime;
+    }
+
+    public void setGroupStartTime(String groupStartTime) {
+        this.groupStartTime = groupStartTime;
+    }
+
+    public String getGroupEndTime() {
+        return groupEndTime;
+    }
+
+    public void setGroupEndTime(String groupEndTime) {
+        this.groupEndTime = groupEndTime;
+    }
 
     public String getVipStartTime() {
         return vipStartTime;

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt

@@ -99,6 +99,7 @@ object RouterPath {
             const val VIP_COURSE_SETTING = "/teacher/ui/course/VIPCourseSettingActivity"
             const val VIP_COURSE_GROUP_DETAIL = "/teacher/ui/course/VIPOrInterestCourseGroupDetailActivity"
             const val PIANO_COURSE_GROUP_DETAIL = "/teacher/ui/course/PianoCourseGroupDetailActivity"
+            const val GROUP_COURSE_GROUP_DETAIL = "/teacher/ui/course/GroupCourseGroupDetailActivity"
 
         }
     }

+ 6 - 1
BaseLibrary/src/main/java/com/cooleshow/base/utils/StringUtils.java

@@ -262,6 +262,11 @@ public final class StringUtils {
     }
 
     public static String replaceSpace(String s) {
-        return s.replaceAll("\\s*|\r|\n|\t", "");
+        try {
+            return s.replaceAll("\\s*|\r|\n|\t", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
     }
 }

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


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


+ 7 - 0
BaseLibrary/src/main/res/drawable/bg_white_4dp.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners
+        android:radius="4dp" />
+</shape>

+ 5 - 0
classRoom/src/main/res/drawable/shape_f8f8f8_6dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/color_F8F8F8"/>
+    <corners android:radius="6dp"/>
+</shape>

+ 6 - 0
teacher/src/main/AndroidManifest.xml

@@ -401,6 +401,12 @@
             android:windowSoftInputMode="adjustPan" />
 
         <activity
+            android:name=".ui.course.GroupCourseGroupDetailActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout|uiMode"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustPan" />
+
+        <activity
             android:name="com.tencent.tauth.AuthActivity"
             android:launchMode="singleTask"
             android:noHistory="true">

+ 94 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/GroupCourseGroupCourseListAdapter.java

@@ -0,0 +1,94 @@
+package com.cooleshow.teacher.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailListBean;
+import com.cooleshow.teacher.constants.CourseConstants;
+
+import java.util.ArrayList;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2024/11/25.
+ */
+public class GroupCourseGroupCourseListAdapter extends BaseQuickAdapter<VIPCourseGroupDetailListBean, BaseViewHolder> {
+    public GroupCourseGroupCourseListAdapter() {
+        super(R.layout.item_group_course_group_course_layout);
+        addChildClickViewIds(R.id.tv_go_start);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, VIPCourseGroupDetailListBean data) {
+        //时间
+        holder.setText(R.id.tv_time, UiUtils.getCourseTimeString(data.getStartTime(), data.getEndTime()));
+
+        TextView tv_course_status = holder.getView(R.id.tv_course_status);
+
+        holder.setText(R.id.tv_title, data.getCourseGroupName());
+
+        ImageView iv_attendance_status = holder.getView(R.id.iv_attendance_status);
+
+        holder.setText(R.id.tv_name, getStudentNames(data.getCourseStudentVos()));
+
+        holder.setText(R.id.tv_course_name, data.getSubjectName());
+
+        TextView tv_des = holder.getView(R.id.tv_des);
+        tv_des.setText(data.getCoursePlan());
+        tv_des.setVisibility(!TextUtils.isEmpty(data.getCoursePlan()) ? View.VISIBLE : View.GONE);
+
+        TextView tv_go_start = holder.getView(R.id.tv_go_start);
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_NOT_START, data.getStatus())) {
+            //未开始
+            iv_attendance_status.setVisibility(View.GONE);
+            tv_go_start.setVisibility(View.GONE);
+            tv_course_status.setVisibility(View.VISIBLE);
+            tv_course_status.setText("未开始");
+            tv_course_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_ff802c));
+        }
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_ING, data.getStatus())) {
+            //进行中
+            iv_attendance_status.setVisibility(View.GONE);
+            tv_go_start.setVisibility(View.VISIBLE);
+            tv_course_status.setVisibility(View.GONE);
+            tv_course_status.setText("进行中");
+            tv_course_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        }
+
+        if (TextUtils.equals(CourseConstants.COURSE_STATUS_COMPLETE, data.getStatus())) {
+            //已结束
+            iv_attendance_status.setVisibility(View.VISIBLE);
+            tv_go_start.setVisibility(View.GONE);
+            tv_course_status.setVisibility(View.VISIBLE);
+            iv_attendance_status.setImageResource(data.isAttendanceStatus() ? R.drawable.icon_course_attendance_arrive : R.drawable.icon_course_attendance_truancy);
+            tv_course_status.setText("已结束");
+            tv_course_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        }
+    }
+
+    private String getStudentNames(ArrayList<VIPCourseGroupDetailListBean.CourseStudentVosBean> list) {
+        if (list == null || list.size() == 0) {
+            return "";
+        }
+        StringBuilder stringBuilder = new StringBuilder();
+        if (list.size() > 1) {
+            stringBuilder.append(list.get(0).getUserName())
+                    .append("、")
+                    .append(list.get(1).getUserName())
+                    .append("等")
+                    .append(list.size())
+                    .append("人");
+        } else {
+            stringBuilder.append(list.get(0).getUserName());
+        }
+        return stringBuilder.toString();
+    }
+}

+ 52 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/GroupCourseGroupStudentListAdapter.java

@@ -0,0 +1,52 @@
+package com.cooleshow.teacher.adapter;
+
+import android.graphics.Color;
+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.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.bean.PianoCourseGroupStudentListBean;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2024/11/25.
+ */
+public class GroupCourseGroupStudentListAdapter extends BaseQuickAdapter<PianoCourseGroupStudentListBean, BaseViewHolder> {
+    public GroupCourseGroupStudentListAdapter() {
+        super(R.layout.item_group_course_group_student_layout);
+        addChildClickViewIds(R.id.iv_go_chat);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, PianoCourseGroupStudentListBean bean) {
+        ImageView iv_avatar = holder.getView(R.id.iv_avatar);
+        GlideUtils.INSTANCE.loadImage(getContext(), bean.getAvatar(), iv_avatar, R.drawable.icon_teacher_default_head);
+
+        holder.setText(R.id.tv_title, bean.getUserName());
+        holder.setText(R.id.tv_course_name, bean.getSubjectName());
+
+        View csRoot = holder.getView(R.id.cs_root);
+        setBackGroupResources(csRoot, holder);
+    }
+
+    private void setBackGroupResources(View csRoot, BaseViewHolder holder) {
+        int pos = holder.getLayoutPosition();
+        if(getData().size() ==1){
+            csRoot.setBackgroundResource(com.cooleshow.base.R.drawable.shape_10dp_white);
+            return;
+        }
+        if (pos == 0) {
+            csRoot.setBackgroundResource(com.cooleshow.base.R.drawable.bg_white_top_10dp);
+            return;
+        }
+        if (pos == getData().size() - 1) {
+            csRoot.setBackgroundResource(com.cooleshow.base.R.drawable.bg_white_bottom_10dp);
+            return;
+        }
+        csRoot.setBackgroundColor(Color.WHITE);
+    }
+}

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/PianoCourseGroupStudentListAdapter.java

@@ -35,6 +35,10 @@ public class PianoCourseGroupStudentListAdapter extends BaseQuickAdapter<PianoCo
 
     private void setBackGroupResources(View csRoot, BaseViewHolder holder) {
         int pos = holder.getLayoutPosition();
+        if(getData().size() ==1){
+            csRoot.setBackgroundResource(com.cooleshow.base.R.drawable.shape_10dp_white);
+            return;
+        }
         if (pos == 0) {
             csRoot.setBackgroundResource(com.cooleshow.base.R.drawable.bg_white_top_10dp);
             return;

+ 10 - 0
teacher/src/main/java/com/cooleshow/teacher/api/APIService.java

@@ -8,6 +8,7 @@ import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.chatmodule.bean.ContactRoomListBean;
 import com.cooleshow.teacher.bean.AwardStatusBean;
 import com.cooleshow.teacher.bean.CourseOptionListBean;
+import com.cooleshow.teacher.bean.GroupCourseGroupDetailBean;
 import com.cooleshow.teacher.bean.HomeHotAlbumListBean;
 import com.cooleshow.teacher.bean.HomeHotMusicSheetBean;
 import com.cooleshow.teacher.bean.HomeLiveAndVideoBean;
@@ -77,6 +78,7 @@ import io.reactivex.rxjava3.core.Observable;
 import okhttp3.RequestBody;
 import okhttp3.ResponseBody;
 import retrofit2.http.Body;
+import retrofit2.http.Field;
 import retrofit2.http.FieldMap;
 import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.GET;
@@ -921,6 +923,14 @@ public interface APIService {
      * @param
      * @return
      */
+    @GET(TEACHER_GROUP + "courseGroup/queryCourseInfo")
+    Observable<BaseResponse<GroupCourseGroupDetailBean>> getGroupCourseGroupDetail(@Query("groupId") String groupId);
+    /**
+     *
+     *
+     * @param
+     * @return
+     */
     @POST(TEACHER_GROUP + "courseSchedule/list")
     Observable<BaseResponse<ArrayList<VIPCourseGroupDetailListBean>>> getCourseGroupCourseList(@Body RequestBody body);
 

+ 291 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/GroupCourseGroupDetailBean.java

@@ -0,0 +1,291 @@
+package com.cooleshow.teacher.bean;
+
+/**
+ * Author by pq, Date on 2024/11/22.
+ */
+public class GroupCourseGroupDetailBean {
+
+
+    /**
+     * auditVersion : 0
+     * avatar : https://oss.dayaedu.com/klx/user/android/2024-11/2248321_1732503189777.jpeg
+     * backgroundPic :
+     * courseGroupId : 377
+     * courseGroupName : 长笛VIP定制课
+     * courseIntroduce : 长笛VIP定制课
+     * courseNum : 4
+     * coursePlan :
+     * coursePrice : 40.0
+     * courseStartTime : null
+     * degreeFlag : 1
+     * existBuy : 0
+     * imGroupId :
+     * maxStudentNum : 5
+     * mixStudentNum : 1
+     * myself : true
+     * reason :
+     * salesEndDate : null
+     * salesStartDate : null
+     * singleCourseMinutes : 45
+     * status : ING
+     * studentCount : 1
+     * subjectName : 长笛
+     * teacherFlag : 1
+     * teacherId : 2248321
+     * teacherName : 李霞
+     * userName : 郭娜妍
+     */
+
+    private int auditVersion;
+    private String avatar;
+    private String backgroundPic;
+    private int courseGroupId;
+    private String courseGroupName;
+    private String courseIntroduce;
+    private int courseNum;
+    private String coursePlan;
+    private String coursePrice;
+    private String courseStartTime;
+    private int degreeFlag;
+    private int existBuy;
+    private String imGroupId;
+    private int maxStudentNum;
+    private int mixStudentNum;
+    private boolean myself;
+    private String reason;
+    private Object salesEndDate;
+    private Object salesStartDate;
+    private int singleCourseMinutes;
+    private String status;
+    private int studentCount;
+    private String subjectName;
+    private int teacherFlag;
+    private int teacherId;
+    private String teacherName;
+    private String userName;
+    private String completeCourseNum;
+
+    public String getCompleteCourseNum() {
+        return completeCourseNum;
+    }
+
+    public void setCompleteCourseNum(String completeCourseNum) {
+        this.completeCourseNum = completeCourseNum;
+    }
+
+    public int getAuditVersion() {
+        return auditVersion;
+    }
+
+    public void setAuditVersion(int auditVersion) {
+        this.auditVersion = auditVersion;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getBackgroundPic() {
+        return backgroundPic;
+    }
+
+    public void setBackgroundPic(String backgroundPic) {
+        this.backgroundPic = backgroundPic;
+    }
+
+    public int getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(int courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public String getCourseGroupName() {
+        return courseGroupName;
+    }
+
+    public void setCourseGroupName(String courseGroupName) {
+        this.courseGroupName = courseGroupName;
+    }
+
+    public String getCourseIntroduce() {
+        return courseIntroduce;
+    }
+
+    public void setCourseIntroduce(String courseIntroduce) {
+        this.courseIntroduce = courseIntroduce;
+    }
+
+    public int getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(int courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public String getCoursePlan() {
+        return coursePlan;
+    }
+
+    public void setCoursePlan(String coursePlan) {
+        this.coursePlan = coursePlan;
+    }
+
+    public String getCoursePrice() {
+        return coursePrice;
+    }
+
+    public void setCoursePrice(String coursePrice) {
+        this.coursePrice = coursePrice;
+    }
+
+    public String getCourseStartTime() {
+        return courseStartTime;
+    }
+
+    public void setCourseStartTime(String courseStartTime) {
+        this.courseStartTime = courseStartTime;
+    }
+
+    public int getDegreeFlag() {
+        return degreeFlag;
+    }
+
+    public void setDegreeFlag(int degreeFlag) {
+        this.degreeFlag = degreeFlag;
+    }
+
+    public int getExistBuy() {
+        return existBuy;
+    }
+
+    public void setExistBuy(int existBuy) {
+        this.existBuy = existBuy;
+    }
+
+    public String getImGroupId() {
+        return imGroupId;
+    }
+
+    public void setImGroupId(String imGroupId) {
+        this.imGroupId = imGroupId;
+    }
+
+    public int getMaxStudentNum() {
+        return maxStudentNum;
+    }
+
+    public void setMaxStudentNum(int maxStudentNum) {
+        this.maxStudentNum = maxStudentNum;
+    }
+
+    public int getMixStudentNum() {
+        return mixStudentNum;
+    }
+
+    public void setMixStudentNum(int mixStudentNum) {
+        this.mixStudentNum = mixStudentNum;
+    }
+
+    public boolean isMyself() {
+        return myself;
+    }
+
+    public void setMyself(boolean myself) {
+        this.myself = myself;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public Object getSalesEndDate() {
+        return salesEndDate;
+    }
+
+    public void setSalesEndDate(Object salesEndDate) {
+        this.salesEndDate = salesEndDate;
+    }
+
+    public Object getSalesStartDate() {
+        return salesStartDate;
+    }
+
+    public void setSalesStartDate(Object salesStartDate) {
+        this.salesStartDate = salesStartDate;
+    }
+
+    public int getSingleCourseMinutes() {
+        return singleCourseMinutes;
+    }
+
+    public void setSingleCourseMinutes(int singleCourseMinutes) {
+        this.singleCourseMinutes = singleCourseMinutes;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public int getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(int studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public int getTeacherFlag() {
+        return teacherFlag;
+    }
+
+    public void setTeacherFlag(int teacherFlag) {
+        this.teacherFlag = teacherFlag;
+    }
+
+    public int getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(int teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

+ 3 - 3
teacher/src/main/java/com/cooleshow/teacher/bean/LiveCourseListBean.java

@@ -77,7 +77,7 @@ public class LiveCourseListBean {
          */
 
         public String backgroundPic;
-        public int courseGroupId;
+        public String courseGroupId;
         public String courseId;
         public String courseGroupName;
         public String endTime;
@@ -126,11 +126,11 @@ public class LiveCourseListBean {
             this.backgroundPic = backgroundPic;
         }
 
-        public int getCourseGroupId() {
+        public String getCourseGroupId() {
             return courseGroupId;
         }
 
-        public void setCourseGroupId(int courseGroupId) {
+        public void setCourseGroupId(String courseGroupId) {
             this.courseGroupId = courseGroupId;
         }
 

+ 9 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/VIPCourseGroupDetailListBean.java

@@ -51,8 +51,17 @@ public class VIPCourseGroupDetailListBean {
     private String teacherReplied;
     private String userId;
     private String userName;
+    private String coursePlan;
     private ArrayList<CourseStudentVosBean> courseStudentVos;
 
+    public String getCoursePlan() {
+        return coursePlan;
+    }
+
+    public void setCoursePlan(String coursePlan) {
+        this.coursePlan = coursePlan;
+    }
+
     public ArrayList<CourseStudentVosBean> getCourseStudentVos() {
         return courseStudentVos;
     }

+ 33 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/GroupCourseGroupDetailContract.java

@@ -0,0 +1,33 @@
+package com.cooleshow.teacher.contract;
+
+import com.cooleshow.base.bean.CommonCourseConfigBean;
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.teacher.bean.GroupCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.PianoCourseGroupStudentListBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailListBean;
+
+import java.util.ArrayList;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface GroupCourseGroupDetailContract {
+
+    interface View extends BaseView {
+        void getDetailSuccess(GroupCourseGroupDetailBean data);
+
+        void getCourseListSuccess(ArrayList<VIPCourseGroupDetailListBean> data);
+
+
+        void getCourseConfigSuccess(CommonCourseConfigBean data);
+
+        void updateCoursePlanSuccess();
+
+        void getGroupStudentSuccess(ArrayList<PianoCourseGroupStudentListBean> data);
+
+    }
+
+    interface Presenter {
+    }
+}

+ 122 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/course/GroupCourseGroupDetailPresenter.java

@@ -0,0 +1,122 @@
+package com.cooleshow.teacher.presenter.course;
+
+import android.text.TextUtils;
+
+import com.cooleshow.base.bean.CommonCourseConfigBean;
+import com.cooleshow.base.constanst.CourseAttendanceStatusType;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.teacher.api.APIService;
+import com.cooleshow.teacher.bean.GroupCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.PianoCourseGroupStudentListBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailListBean;
+import com.cooleshow.teacher.contract.GroupCourseGroupDetailContract;
+import com.cooleshow.teacher.contract.PianoCourseGroupDetailContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class GroupCourseGroupDetailPresenter extends BasePresenter<GroupCourseGroupDetailContract.View> implements GroupCourseGroupDetailContract.Presenter {
+
+    public void queryDetail(boolean isShowLoading, String courseGroupId) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        addSubscribe(create(APIService.class).getGroupCourseGroupDetail(courseGroupId), new BaseObserver<GroupCourseGroupDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(GroupCourseGroupDetailBean data) {
+                if (getView() != null) {
+                    getView().getDetailSuccess(data);
+                }
+            }
+
+        });
+    }
+
+    public void queryCourseList(boolean isShowLoading, String courseGroupId, String classMonth, String status, String attendanceStatus) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("courseGroupId", courseGroupId);
+            if (!TextUtils.isEmpty(classMonth)) {
+                jsonObject.putOpt("classMonth", classMonth);
+            }
+            if (!TextUtils.isEmpty(status)) {
+                jsonObject.putOpt("status", status);
+            }
+            if (!TextUtils.isEmpty(attendanceStatus)) {
+                boolean attendanceStatusFlag = false;
+                if(TextUtils.equals(attendanceStatus, CourseAttendanceStatusType.ARRIVE_FOR_CLASS.getId())){
+                    attendanceStatusFlag = true;
+                }
+                jsonObject.putOpt("attendanceStatus", attendanceStatusFlag);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getCourseGroupCourseList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<ArrayList<VIPCourseGroupDetailListBean>>(getView()) {
+            @Override
+            protected void onSuccess(ArrayList<VIPCourseGroupDetailListBean> data) {
+                if (getView() != null) {
+                    getView().getCourseListSuccess(data);
+                }
+            }
+
+        });
+    }
+
+    public void getCourseConfig() {
+        addSubscribe(create(APIService.class).getCourseConfig(), new BaseObserver<CommonCourseConfigBean>(getView()) {
+            @Override
+            protected void onSuccess(CommonCourseConfigBean data) {
+                if (getView() != null) {
+                    getView().getCourseConfigSuccess(data);
+                }
+            }
+        });
+    }
+
+    public void updateCoursePlan(String groupId, String coursePlan) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        HashMap<String, String> map = new HashMap<>();
+        map.put("groupId", groupId);
+        map.put("coursePlan", coursePlan);
+        addSubscribe(create(APIService.class).updateCoursePlan(map), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().updateCoursePlanSuccess();
+                }
+            }
+        });
+    }
+
+    public void getCourseGroupStudents(String groupId) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        HashMap<String, String> map = new HashMap<>();
+        map.put("groupId", groupId);
+        addSubscribe(create(APIService.class).getCourseGroupStudents(map), new BaseObserver<ArrayList<PianoCourseGroupStudentListBean>>(getView()) {
+            @Override
+            protected void onSuccess(ArrayList<PianoCourseGroupStudentListBean> data) {
+                if (getView() != null) {
+                    getView().getGroupStudentSuccess(data);
+                }
+            }
+        });
+    }
+}

+ 311 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupDetailActivity.java

@@ -0,0 +1,311 @@
+package com.cooleshow.teacher.ui.course;
+
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.bean.CommonCourseConfigBean;
+import com.cooleshow.base.constanst.CourseGroupStatusType;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GlideImageLoaderUtils;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.StringUtils;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.widgets.SolveEditTextScrollClash;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.adapter.MineCoursePageAdapter;
+import com.cooleshow.teacher.bean.GroupCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.PianoCourseGroupStudentListBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailListBean;
+import com.cooleshow.teacher.constants.CourseConstants;
+import com.cooleshow.teacher.contract.GroupCourseGroupDetailContract;
+import com.cooleshow.teacher.contract.PianoCourseGroupDetailContract;
+import com.cooleshow.teacher.databinding.AcGroupCourseGroupDetailLayoutBinding;
+import com.cooleshow.teacher.databinding.AcPianoCourseGroupDetailLayoutBinding;
+import com.cooleshow.teacher.presenter.course.GroupCourseGroupDetailPresenter;
+import com.cooleshow.teacher.presenter.course.PianoCourseGroupDetailPresenter;
+import com.cooleshow.teacher.widgets.AppBarLayoutStateChangeListener;
+import com.cooleshow.teacher.widgets.dialog.AddCourseGroupPlanDialog;
+import com.google.android.material.appbar.AppBarLayout;
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+/**
+ * Author by pq, Date on 2024/11/22.
+ */
+@Route(path = RouterPath.CourseCenter.GROUP_COURSE_GROUP_DETAIL)
+public class GroupCourseGroupDetailActivity extends BaseMVPActivity<AcGroupCourseGroupDetailLayoutBinding, GroupCourseGroupDetailPresenter> implements GroupCourseGroupDetailContract.View, View.OnClickListener {
+    private int titleStyleMode = 1;//根据折叠展开状态控制title样式
+    public static final int EXPAND_MODE = 1;
+    public static final int COLLAP_MODE = 2;
+    private AppBarLayoutStateChangeListener.State lastState = AppBarLayoutStateChangeListener.State.EXPANDED;
+    private String courseGroupId;
+    private CommonCourseConfigBean mConfigBean;
+    private GroupCourseGroupDetailBean mDetailBean;
+    private List<String> titles = new ArrayList<String>(Arrays.asList("课程列表", "上课学生"));
+    private GroupCourseGroupDetailStudentFragment mStudentFragment;
+    private GroupCourseGroupDetailFragment mCourseListFragment;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(GroupCourseGroupDetailActivity.this);
+    }
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "小组课详情");
+        viewBinding.scCoursePlan.setOnTouchListener(new SolveEditTextScrollClash(viewBinding.scCoursePlan));
+        viewBinding.scCoursePlan.setVerticalScrollBarEnabled(true);
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        courseGroupId = getIntent().getStringExtra(CourseConstants.COURSE_GROUP_ID);
+        if (TextUtils.isEmpty(courseGroupId)) {
+            finish();
+            return;
+        }
+        initListener();
+        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(viewBinding.tablayout, viewBinding.viewPager, (tab, position) -> {
+            //这里需要根据position修改tab的样式和文字等
+            createTab(tab, titles.get(position));
+        });
+        mCourseListFragment = new GroupCourseGroupDetailFragment();
+        Bundle bundle = new Bundle();
+        bundle.putString(CourseConstants.COURSE_GROUP_ID, courseGroupId);
+        mCourseListFragment.setArguments(bundle);
+        mStudentFragment = new GroupCourseGroupDetailStudentFragment();
+        ArrayList<Fragment> mFragments = new ArrayList<>();
+        mFragments.add(mCourseListFragment);
+        mFragments.add(mStudentFragment);
+        MineCoursePageAdapter adapter = new MineCoursePageAdapter(this);
+        adapter.setFragments(mFragments);
+        viewBinding.viewPager.setAdapter(adapter);
+        viewBinding.viewPager.setOffscreenPageLimit(mFragments.size());
+        tabLayoutMediator.attach();
+    }
+
+
+    private void initListener() {
+        viewBinding.tvEditPlan.setOnClickListener(this);
+        viewBinding.appBarLayout.addOnOffsetChangedListener(new AppBarLayoutStateChangeListener() {
+
+            @Override
+            public void onStateChanged(AppBarLayout appBarLayout, State state) {
+                switch (state) {
+                    case EXPANDED:    //展开
+                        switchTitleStyle(EXPAND_MODE);
+                        break;
+                    case COLLAPSED:    //折叠
+                        switchTitleStyle(COLLAP_MODE);
+                        break;
+                    case INTERMEDIATE: //中间状态
+                        if (lastState == State.COLLAPSED) {
+                            switchTitleStyle(EXPAND_MODE);
+                        }
+                        break;
+                }
+                lastState = state;
+            }
+        });
+
+        viewBinding.tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                if (tab != null && tab.getCustomView() != null) {
+                    View customView = tab.getCustomView();
+                    TextView tv_text = customView.findViewById(R.id.tv_text);
+                    tv_text.setTextSize(16);
+                    tv_text.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_131415));
+                    tv_text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+                }
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+                if (tab != null && tab.getCustomView() != null) {
+                    View customView = tab.getCustomView();
+                    TextView tv_text = customView.findViewById(R.id.tv_text);
+                    tv_text.setTextSize(16);
+                    tv_text.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_80000000));
+                    tv_text.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
+                }
+            }
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+
+            }
+        });
+    }
+
+    private TabLayout.Tab createTab(TabLayout.Tab tab, String text) {
+        View view = LayoutInflater.from(this).inflate(R.layout.view_pc_detail_course_tab_layout, null);
+        TextView tv_text = view.findViewById(R.id.tv_text);
+        tv_text.setText(text);
+        tab.setCustomView(view);
+        return tab;
+    }
+
+
+    private void switchTitleStyle(int mode) {
+        if (titleStyleMode == mode) {
+            return;
+        }
+        titleStyleMode = mode;
+        if (mode == 1) {
+            viewBinding.collapsingToolbarLayout.setContentScrimColor(Color.TRANSPARENT);
+            viewBinding.collapsingToolbarLayout.setStatusBarScrimColor(Color.TRANSPARENT);
+            viewBinding.flTab.setBackgroundColor(Color.TRANSPARENT);
+        } else {
+            viewBinding.collapsingToolbarLayout.setContentScrimColor(Color.WHITE);
+            viewBinding.collapsingToolbarLayout.setStatusBarScrimColor(Color.WHITE);
+            viewBinding.flTab.setBackgroundColor(Color.WHITE);
+        }
+    }
+
+    @Override
+    protected AcGroupCourseGroupDetailLayoutBinding getLayoutView() {
+        return AcGroupCourseGroupDetailLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected GroupCourseGroupDetailPresenter createPresenter() {
+        return new GroupCourseGroupDetailPresenter();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        refresh();
+    }
+
+    private void refresh() {
+        presenter.queryDetail(true, courseGroupId);
+        presenter.getCourseGroupStudents(courseGroupId);
+    }
+
+
+    @Override
+    public void getDetailSuccess(GroupCourseGroupDetailBean bean) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        this.mDetailBean = bean;
+
+        GlideUtils.INSTANCE.loadImage(this, bean.getBackgroundPic(), viewBinding.ivBg, com.cooleshow.base.R.drawable.bg_video_placeholder);
+        GlideUtils.INSTANCE.loadImage(this,bean.getAvatar(),viewBinding.ivAvatar,R.drawable.icon_teacher_default_head);
+        viewBinding.tvCourseName.setText(bean.getSubjectName());
+
+        viewBinding.tvTitle.setText(bean.getCourseGroupName());
+        String timeStr = TextUtils.isEmpty(bean.getCourseStartTime()) ? "" : TimeUtils.date2String(TimeUtils.string2Date(bean.getCourseStartTime()), "yyyy-MM-dd HH:mm");
+        //时间
+        viewBinding.tvTime.setText(String.format("开课时间:%s", timeStr));
+        viewBinding.tvBuyNum.setText(UiUtils.getBuyNumTip2("", String.valueOf(bean.getStudentCount())));
+
+        viewBinding.tvTeacherName.setText(bean.getTeacherName());
+        viewBinding.tvCourseCompletedValue.setText(bean.getCompleteCourseNum());
+        viewBinding.tvCourseTotalValue.setText(String.valueOf(bean.getCourseNum()));
+
+        //价格
+        viewBinding.tvPrice.setText(UiUtils.getLiveCoursePriceTextForStu(bean.getCoursePrice()));
+
+        viewBinding.tvPriceUnit.setText(String.format("/%d课时", bean.getCourseNum()));
+
+        String courseIntroduce = StringUtils.replaceSpace(bean.getCourseIntroduce());
+        boolean hasPlan = !TextUtils.isEmpty(courseIntroduce);
+        viewBinding.tvPlanContent.setText(courseIntroduce);
+        viewBinding.csCoursePlan.setVisibility(hasPlan ? View.VISIBLE : View.GONE);
+    }
+
+    @Override
+    public void getCourseListSuccess(ArrayList<VIPCourseGroupDetailListBean> data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+    }
+
+    @Override
+    public void getCourseConfigSuccess(CommonCourseConfigBean data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        this.mConfigBean = data;
+    }
+
+    @Override
+    public void updateCoursePlanSuccess() {
+        if (!checkActivityExist()) {
+            return;
+        }
+        refresh();
+    }
+
+    @Override
+    public void getGroupStudentSuccess(ArrayList<PianoCourseGroupStudentListBean> data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        if (mStudentFragment != null) {
+            mStudentFragment.setData(data);
+        }
+    }
+
+    private void showAddPlanDialog(String content) {
+        if (UiUtils.isFastClick()) {
+            return;
+        }
+        AddCourseGroupPlanDialog courseGroupPlanDialog = new AddCourseGroupPlanDialog(this);
+        courseGroupPlanDialog.show();
+        courseGroupPlanDialog.setOnEventListener(new AddCourseGroupPlanDialog.OnEventListener() {
+            @Override
+            public void onResult(String content) {
+                courseGroupPlanDialog.dismiss();
+                presenter.updateCoursePlan(courseGroupId, content);
+            }
+        });
+        if (!TextUtils.isEmpty(content)) {
+            courseGroupPlanDialog.setContentText(content);
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.view_add_plan) {
+            showAddPlanDialog("");
+            return;
+        }
+        if (id == R.id.tv_edit_plan) {
+            if (mDetailBean != null) {
+                showAddPlanDialog(mDetailBean.getCoursePlan());
+            }
+            return;
+        }
+
+    }
+
+
+    private void showTimeSelectPicker() {
+    }
+
+
+}

+ 363 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupDetailFragment.java

@@ -0,0 +1,363 @@
+package com.cooleshow.teacher.ui.course;
+
+import android.content.DialogInterface;
+import android.graphics.Color;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnDismissListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemChildClickListener;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.bean.CommonCourseConfigBean;
+import com.cooleshow.base.constanst.CourseAttendanceStatusType;
+import com.cooleshow.base.constanst.CourseStatusType;
+import com.cooleshow.base.interfaces.IFilterViewData;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.dialog.CommonFilterDialog;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.adapter.GroupCourseGroupCourseListAdapter;
+import com.cooleshow.teacher.adapter.PianoCourseGroupCourseListAdapter;
+import com.cooleshow.teacher.bean.PianoCourseGroupStudentListBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupDetailListBean;
+import com.cooleshow.teacher.constants.CourseConstants;
+import com.cooleshow.teacher.contract.PianoCourseGroupDetailContract;
+import com.cooleshow.teacher.databinding.FgGroupCourseGroupDetailLayoutBinding;
+import com.cooleshow.teacher.databinding.FgPianoCourseGroupDetailLayoutBinding;
+import com.cooleshow.teacher.presenter.course.PianoCourseGroupDetailPresenter;
+import com.dayayuemeng.classroom.helper.OpenClassRoomHelper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+/**
+ * Author by pq, Date on 2024/11/25.
+ * 小组课课程组-课程列表
+ */
+public class GroupCourseGroupDetailFragment extends BaseMVPFragment<FgGroupCourseGroupDetailLayoutBinding, PianoCourseGroupDetailPresenter> implements PianoCourseGroupDetailContract.View, View.OnClickListener {
+
+    private GroupCourseGroupCourseListAdapter mAdapter;
+    private String courseGroupId;
+    private String classMonth;
+    private Date currentSelectDate;
+    private String courseStatus = CourseStatusType.ALL.getId();
+    private String currentAttendanceStatus;
+    private TimePickerView pvTime;
+    private List<IFilterViewData> statusList;//状态筛选
+    private List<IFilterViewData> attendanceStatusList;//考勤状态筛选
+    private int currentSelectStatusPosition = 0;
+    private int currentSelectAttendancePosition = 0;
+    private CommonFilterDialog mAttendanceStatusFilterDialog;
+    private CommonFilterDialog mStatusFilterDialog;
+    private CommonCourseConfigBean mConfigBean;
+
+    @Override
+    protected FgGroupCourseGroupDetailLayoutBinding getLayoutView() {
+        return FgGroupCourseGroupDetailLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected PianoCourseGroupDetailPresenter createPresenter() {
+        return new PianoCourseGroupDetailPresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+        if (getArguments() != null) {
+            courseGroupId = getArguments().getString(CourseConstants.COURSE_GROUP_ID);
+        }
+    }
+
+    @Override
+    protected void initData() {
+        mAdapter = new GroupCourseGroupCourseListAdapter();
+        initListener();
+        initFilterData();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
+        mAdapter.setEmptyView(emptyViewLayout);
+        mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerView.setAdapter(mAdapter);
+    }
+
+    private void initFilterData() {
+        CourseStatusType[] values = CourseStatusType.values();
+        List<CourseStatusType> courseGroupStatusTypes = Arrays.asList(values);
+        statusList = new ArrayList<IFilterViewData>(courseGroupStatusTypes);
+
+        CourseAttendanceStatusType[] attendanceStatuValues = CourseAttendanceStatusType.values();
+        List<CourseAttendanceStatusType> attendanceStatus = Arrays.asList(attendanceStatuValues);
+        attendanceStatusList = new ArrayList<>(attendanceStatus);
+    }
+
+    private void initListener() {
+        mViewBinding.flTime.setOnClickListener(this);
+        mViewBinding.flStatus.setOnClickListener(this);
+        mViewBinding.flAttendance.setOnClickListener(this);
+
+        mAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (position < mAdapter.getData().size()) {
+                    VIPCourseGroupDetailListBean bean = mAdapter.getData().get(position);
+                    ARouter.getInstance().build(RouterPath.CourseCenter.PIANO_ROOM_COURSE_DETAIL)
+                            .withString(CourseConstants.COURSE_ID, bean.getCourseId())
+                            .navigation();
+                }
+            }
+        });
+
+        mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() {
+            @Override
+            public void onItemChildClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                //去上课
+                if (UiUtils.isFastClick()) {
+                    return;
+                }
+                if (view.getId() == R.id.tv_go_start) {
+                    if (position < mAdapter.getData().size()) {
+                        VIPCourseGroupDetailListBean bean = mAdapter.getData().get(position);
+                        goCourse(bean.getId(), bean.getStartTime(), bean.getSubjectName());
+                    }
+                }
+            }
+        });
+    }
+
+    private void goCourse(String id, String startTime, String subjectName) {
+        if (mConfigBean != null) {
+            boolean lessThanTargetTime = TimeUtils.isLessThanTargetTime(mConfigBean.getGroupStartTime(), startTime);
+            if (!lessThanTargetTime) {
+                ToastUtil.getInstance().showShort("课程还未开始,请在上课前" + mConfigBean.getGroupStartTime() + "分钟进入");
+                return;
+            }
+            OpenClassRoomHelper.start(getActivity(), id, subjectName);
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        refresh();
+    }
+
+    public void refreshTabBg(boolean isExpandMode) {
+//        mViewBinding.viewTabBg.setBackgroundColor(isExpandMode ? Color.TRANSPARENT : Color.WHITE);
+    }
+
+    private void refresh() {
+        presenter.getCourseConfig();
+        reBuildFilter(currentSelectDate, courseStatus, currentAttendanceStatus);
+    }
+
+    private void reBuildFilter(Date date, String status, String attendanceStatus) {
+        currentSelectDate = date != null ? date : TimeUtils.getNowDate();
+        String targetDateTimeStr = TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"));
+        String targetDateTimeText = TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy年MM月"));
+        classMonth = targetDateTimeStr;
+        courseStatus = !TextUtils.isEmpty(status) ? status : CourseStatusType.ALL.getId();
+        currentAttendanceStatus = !TextUtils.isEmpty(attendanceStatus) ? attendanceStatus : CourseAttendanceStatusType.ALL.getId();
+        if (mViewBinding != null) {
+            mViewBinding.tvTime.setText(targetDateTimeText);
+        }
+        refreshCourseList(false);
+    }
+
+    private void refreshCourseList(boolean isShowLoading) {
+        if (TextUtils.isEmpty(courseGroupId)) {
+            return;
+        }
+        presenter.queryCourseList(isShowLoading, courseGroupId, "", courseStatus, currentAttendanceStatus);
+    }
+
+    @Override
+    public void getDetailSuccess(VIPCourseGroupDetailBean data) {
+        //do nothing
+    }
+
+    @Override
+    public void getCourseListSuccess(ArrayList<VIPCourseGroupDetailListBean> data) {
+        if (isDetached()) {
+            return;
+        }
+        if (mAdapter != null) {
+            mAdapter.setList(data);
+        }
+    }
+
+    @Override
+    public void getCourseConfigSuccess(CommonCourseConfigBean data) {
+        if (isDetached()) {
+            return;
+        }
+        this.mConfigBean = data;
+    }
+
+    @Override
+    public void updateCoursePlanSuccess() {
+        //do nothing
+    }
+
+    @Override
+    public void getGroupStudentSuccess(ArrayList<PianoCourseGroupStudentListBean> data) {
+        //do nothing
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.fl_time) {
+            showTimeSelectPicker();
+            return;
+        }
+        if (id == R.id.fl_status) {
+            selectCourseStatus();
+            return;
+        }
+
+        if (id == R.id.fl_attendance) {
+            selectAttendanceStatus();
+            return;
+        }
+    }
+
+    private void showTimeSelectPicker() {
+        if (pvTime == null) {
+            pvTime = new TimePickerBuilder(getContext(), (date, v) -> {//选中事件回调
+                reBuildFilter(date, courseStatus, currentAttendanceStatus);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout, new CustomListener() {
+                        @Override
+                        public void customLayout(View v) {
+                            //自定义布局中的控件初始化及事件处理
+                            final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
+                            TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
+                            tvSubmit.setOnClickListener(new View.OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    pvTime.returnData();
+                                    pvTime.dismiss();
+                                }
+                            });
+                            ivCancel.setOnClickListener(new View.OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    pvTime.dismiss();
+                                }
+                            });
+
+                        }
+                    })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
+                    .setLineSpacingMultiplier(2.5f)
+                    .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
+                    .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
+                    .isDialog(false)//是否显示为对话框样式
+                    .setLabel("年", "月", "", "", "", "")
+                    .build();
+
+            pvTime.setOnDismissListener(new OnDismissListener() {
+                @Override
+                public void onDismiss(Object o) {
+                    UiUtils.refreshFilterTextStyle2(false, mViewBinding.tvTime);
+                }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
+                }
+            });
+        }
+        Calendar calendar = Calendar.getInstance();
+        if (currentSelectDate == null) {
+            currentSelectDate = TimeUtils.getNowDate();
+        }
+        calendar.setTime(currentSelectDate);
+        pvTime.setDate(calendar);
+        if (!pvTime.isShowing()) {
+            pvTime.show();
+        }
+    }
+
+    private void selectCourseStatus() {
+        if (mStatusFilterDialog == null) {
+            mStatusFilterDialog = new CommonFilterDialog<IFilterViewData>(getContext());
+            mStatusFilterDialog.setOnEventListener(new CommonFilterDialog.OnEventListener() {
+                @Override
+                public void onItemClickListener(BaseQuickAdapter baseQuickAdapter, int pos) {
+                    if (statusList != null && pos < statusList.size()) {
+                        GroupCourseGroupDetailFragment.this.currentSelectStatusPosition = pos;
+                        IFilterViewData iFilterViewData = statusList.get(pos);
+                        courseStatus = iFilterViewData.getDataId();
+                        mViewBinding.tvCourseStatus.setText(!TextUtils.isEmpty(courseStatus) ? iFilterViewData.getShowName() : "全部状态");
+                        reBuildFilter(currentSelectDate, courseStatus, currentAttendanceStatus);
+                    }
+                }
+            });
+
+            mStatusFilterDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+                @Override
+                public void onDismiss(DialogInterface dialog) {
+                    UiUtils.refreshFilterTextStyle(false, mViewBinding.tvCourseStatus);
+                }
+            });
+        }
+        if (!mStatusFilterDialog.isShowing()) {
+            mStatusFilterDialog.show();
+            UiUtils.refreshFilterTextStyle(true, mViewBinding.tvCourseStatus);
+        }
+        mStatusFilterDialog.setSelectPos(currentSelectStatusPosition);
+        mStatusFilterDialog.setData(statusList);
+
+    }
+
+
+    private void selectAttendanceStatus() {
+        if (mAttendanceStatusFilterDialog == null) {
+            mAttendanceStatusFilterDialog = new CommonFilterDialog<IFilterViewData>(getContext());
+            mAttendanceStatusFilterDialog.setOnEventListener(new CommonFilterDialog.OnEventListener() {
+                @Override
+                public void onItemClickListener(BaseQuickAdapter baseQuickAdapter, int pos) {
+                    if (attendanceStatusList != null && pos < attendanceStatusList.size()) {
+                        GroupCourseGroupDetailFragment.this.currentSelectAttendancePosition = pos;
+                        IFilterViewData iFilterViewData = attendanceStatusList.get(pos);
+                        currentAttendanceStatus = iFilterViewData.getDataId();
+                        mViewBinding.tvAttendanceStatus.setText(iFilterViewData.getShowName());
+                        reBuildFilter(currentSelectDate, courseStatus, currentAttendanceStatus);
+                    }
+                }
+            });
+
+            mAttendanceStatusFilterDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+                @Override
+                public void onDismiss(DialogInterface dialog) {
+                    UiUtils.refreshFilterTextStyle(false, mViewBinding.tvAttendanceStatus);
+                }
+            });
+        }
+        if (!mAttendanceStatusFilterDialog.isShowing()) {
+            mAttendanceStatusFilterDialog.show();
+            UiUtils.refreshFilterTextStyle(true, mViewBinding.tvAttendanceStatus);
+        }
+        mAttendanceStatusFilterDialog.setSelectPos(currentSelectAttendancePosition);
+        mAttendanceStatusFilterDialog.setData(attendanceStatusList);
+    }
+}

+ 71 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupDetailStudentFragment.java

@@ -0,0 +1,71 @@
+package com.cooleshow.teacher.ui.course;
+
+import android.view.View;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemChildClickListener;
+import com.cooleshow.base.ui.fragment.BaseFragment;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.chatmodule.utils.helper.ChatHelper;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.adapter.GroupCourseGroupStudentListAdapter;
+import com.cooleshow.teacher.adapter.PianoCourseGroupStudentListAdapter;
+import com.cooleshow.teacher.bean.PianoCourseGroupStudentListBean;
+import com.cooleshow.teacher.databinding.FgGroupCourseGroupDetailStudentListLayoutBinding;
+import com.cooleshow.teacher.databinding.FgPianoCourseGroupDetailStudentListLayoutBinding;
+
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+/**
+ * Author by pq, Date on 2024/11/25.
+ */
+public class GroupCourseGroupDetailStudentFragment extends BaseFragment<FgGroupCourseGroupDetailStudentListLayoutBinding> {
+
+    private GroupCourseGroupStudentListAdapter mAdapter;
+
+    @Override
+    protected FgGroupCourseGroupDetailStudentListLayoutBinding getLayoutView() {
+        return FgGroupCourseGroupDetailStudentListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+        mAdapter = new GroupCourseGroupStudentListAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(R.drawable.icon_empty_content, "暂无学员");
+        mAdapter.setEmptyView(emptyViewLayout);
+        mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerView.setAdapter(mAdapter);
+        initListener();
+    }
+
+    private void initListener() {
+        mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() {
+            @Override
+            public void onItemChildClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                int id = view.getId();
+                if (id == R.id.iv_go_chat) {
+                    if (position < mAdapter.getData().size()) {
+                        PianoCourseGroupStudentListBean pianoCourseGroupStudentListBean = mAdapter.getData().get(position);
+                        ChatHelper.getInstance().goChat(pianoCourseGroupStudentListBean.getImUserId(), pianoCourseGroupStudentListBean.getStudentName());
+                    }
+                    return;
+                }
+            }
+        });
+    }
+
+    public void setData(List<PianoCourseGroupStudentListBean> data) {
+        if (mAdapter != null) {
+            mAdapter.setList(data);
+        }
+    }
+}

+ 3 - 4
teacher/src/main/java/com/cooleshow/teacher/ui/course/GroupCourseGroupFragment.java

@@ -154,10 +154,9 @@ public class GroupCourseGroupFragment extends BaseMVPFragment<FragmentLiveCourse
 
         mAdapter.setOnItemClickListener((adapter, view, position) -> {
             LiveCourseListBean.RowsBean item = (LiveCourseListBean.RowsBean) adapter.getItem(position);
-//            ARouter.getInstance()
-//                    .build(RouterPath.WebCenter.ACTIVITY_HTML)
-//                    .withString(WebConstants.WEB_URL, String.format(WebConstants.TEACHER_LIVE_DETAIL_NORMAL_COURSE, item.courseGroupId, item.courseId))
-//                    .navigation();
+            ARouter.getInstance().build(RouterPath.CourseCenter.GROUP_COURSE_GROUP_DETAIL)
+                    .withString(CourseConstants.COURSE_GROUP_ID, item.getCourseGroupId())
+                    .navigation();
         });
         mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() {
             @Override

+ 0 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoCourseGroupDetailActivity.java

@@ -191,7 +191,6 @@ public class PianoCourseGroupDetailActivity extends BaseMVPActivity<AcPianoCours
             return;
         }
         titleStyleMode = mode;
-        mCourseListFragment.refreshTabBg(mode ==1);
         if (mode == 1) {
             viewBinding.collapsingToolbarLayout.setContentScrimColor(Color.TRANSPARENT);
             viewBinding.collapsingToolbarLayout.setStatusBarScrimColor(Color.TRANSPARENT);

+ 2 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoCourseGroupDetailFragment.java

@@ -159,7 +159,7 @@ public class PianoCourseGroupDetailFragment extends BaseMVPFragment<FgPianoCours
     }
 
     public void refreshTabBg(boolean isExpandMode) {
-        mViewBinding.viewTabBg.setBackgroundColor(isExpandMode ? Color.TRANSPARENT : Color.WHITE);
+//        mViewBinding.viewTabBg.setBackgroundColor(isExpandMode ? Color.TRANSPARENT : Color.WHITE);
     }
 
     private void refresh() {
@@ -184,7 +184,7 @@ public class PianoCourseGroupDetailFragment extends BaseMVPFragment<FgPianoCours
         if (TextUtils.isEmpty(courseGroupId)) {
             return;
         }
-        presenter.queryCourseList(isShowLoading, courseGroupId, classMonth, courseStatus, currentAttendanceStatus);
+        presenter.queryCourseList(isShowLoading, courseGroupId, "", courseStatus, currentAttendanceStatus);
     }
 
     @Override

+ 413 - 0
teacher/src/main/res/layout/ac_group_course_group_detail_layout.xml

@@ -0,0 +1,413 @@
+<?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="match_parent">
+
+    <include
+        android:id="@+id/toolbar_include"
+        layout="@layout/common_toolbar_layout" />
+
+    <androidx.coordinatorlayout.widget.CoordinatorLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/toolbar_include">
+
+        <com.google.android.material.appbar.AppBarLayout
+            android:id="@+id/app_bar_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/transparent"
+            android:theme="@style/AppTheme.AppBarOverlay">
+
+            <com.google.android.material.appbar.CollapsingToolbarLayout
+                android:id="@+id/collapsing_toolbar_layout"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="0dp"
+                app:contentScrim="@color/transparent"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
+                app:scrimAnimationDuration="10"
+                app:statusBarScrim="@color/transparent"
+                app:titleEnabled="false">
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    app:layout_collapseMode="none">
+
+                    <androidx.constraintlayout.widget.ConstraintLayout
+                        android:layout_width="match_parent"
+                        android:id="@+id/cs_header"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/bg_white_10dp"
+                        android:paddingBottom="12dp">
+
+                        <ImageView
+                            android:id="@+id/iv_bg"
+                            android:layout_width="0dp"
+                            app:layout_constraintDimensionRatio="h,16:9"
+                            app:layout_constraintRight_toRightOf="parent"
+                            android:layout_height="0dp"
+                            app:layout_constraintLeft_toLeftOf="parent"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:qmui_corner_radius="6dp" />
+
+                        <TextView
+                            android:id="@+id/tv_course_name"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_19"
+                            android:layout_marginTop="8dp"
+                            android:layout_marginStart="@dimen/dp_8"
+                            android:background="@drawable/shape_66000000_3dp"
+                            android:gravity="center"
+                            android:includeFontPadding="false"
+                            android:paddingStart="@dimen/dp_6"
+                            android:paddingEnd="@dimen/dp_6"
+                            android:textColor="@color/white"
+                            android:textSize="@dimen/sp_12"
+                            app:layout_constraintTop_toTopOf="@+id/iv_bg"
+                            app:layout_constraintLeft_toLeftOf="@+id/iv_bg"
+                            tools:text="单簧管" />
+
+                        <TextView
+                            android:visibility="gone"
+                            android:id="@+id/tv_course_status_tip"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:background="@drawable/shape_ffe7e7_15dp_left"
+                            android:gravity="center"
+                            android:paddingStart="12dp"
+                            android:paddingTop="3dp"
+                            android:paddingEnd="12dp"
+                            android:paddingBottom="3dp"
+                            android:text="销售中"
+                            android:textColor="@color/color_ff1919"
+                            android:textSize="@dimen/sp_10"
+                            app:layout_constraintBottom_toBottomOf="@+id/tv_course_name"
+                            app:layout_constraintRight_toRightOf="@+id/iv_bg"
+                            app:layout_constraintTop_toTopOf="@+id/tv_course_name" />
+
+
+                        <TextView
+                            android:layout_marginEnd="14dp"
+                            android:layout_marginStart="14dp"
+                            android:id="@+id/tv_title"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:ellipsize="end"
+                            android:includeFontPadding="false"
+                            android:maxLines="1"
+                            android:textColor="@color/color_1a1a1a"
+                            android:textSize="@dimen/sp_16"
+                            android:textStyle="bold"
+                            android:layout_marginTop="8dp"
+                            app:layout_constraintLeft_toLeftOf="@+id/iv_bg"
+                            app:layout_constraintRight_toRightOf="@+id/iv_bg"
+                            app:layout_constraintTop_toBottomOf="@+id/iv_bg"
+                            app:layout_constraintVertical_chainStyle="packed"
+                            tools:text="张豆张豆豆豆张豆张豆豆豆张豆张豆豆豆张豆张豆豆豆" />
+
+                        <TextView
+                            android:drawableStart="@drawable/icon_live_course_time_tag"
+                            android:id="@+id/tv_time"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="12dp"
+                            android:includeFontPadding="false"
+                            android:textColor="@color/color_333333"
+                            android:textSize="@dimen/sp_14"
+                            android:textStyle="bold"
+                            android:drawablePadding="6dp"
+                            app:layout_constraintTop_toBottomOf="@+id/tv_title"
+                            app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+                            tools:text="开课时间:2024-11-16 09:30" />
+
+                        <TextView
+                            android:visibility="gone"
+                            android:id="@+id/tv_des"
+                            android:layout_width="0dp"
+                            android:layout_height="wrap_content"
+                            android:ellipsize="end"
+                            android:includeFontPadding="false"
+                            android:maxLines="1"
+                            android:textColor="@color/color_777777"
+                            android:textSize="@dimen/sp_14"
+                            android:layout_marginTop="4dp"
+                            app:layout_constraintLeft_toLeftOf="@+id/iv_bg"
+                            app:layout_constraintRight_toRightOf="@+id/iv_bg"
+                            app:layout_constraintTop_toBottomOf="@+id/tv_title"
+                            tools:text="国际著名长笛演奏家、教育家子珊女士为您讲教育家子珊女士为您讲教育家子珊女士为您讲" />
+
+                        <TextView
+                            android:id="@+id/tv_buy_num"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:background="@drawable/shape_12ff802c_2dp"
+                            android:textColor="@color/color_ff6827"
+                            android:textSize="@dimen/sp_12"
+                            android:visibility="visible"
+                            android:paddingStart="4dp"
+                            android:paddingEnd="4dp"
+                            android:paddingTop="3dp"
+                            android:paddingBottom="3dp"
+                            android:includeFontPadding="false"
+                            app:layout_constraintBottom_toBottomOf="@+id/tv_time"
+                            app:layout_constraintTop_toTopOf="@+id/tv_time"
+                            app:layout_constraintRight_toRightOf="@+id/tv_title"
+                            tools:text="6人已购买" />
+
+
+                        <View
+                            android:id="@+id/view_line"
+                            android:layout_marginTop="12dp"
+                            app:layout_constraintRight_toRightOf="@+id/tv_title"
+                            app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+                            app:layout_constraintTop_toBottomOf="@+id/tv_time"
+                            android:background="@color/color_f2f2f2"
+                            android:layout_width="match_parent"
+                            android:layout_height="1dp"/>
+
+                        <de.hdodenhof.circleimageview.CircleImageView
+                            android:layout_width="40dp"
+                            android:id="@+id/iv_avatar"
+                            android:layout_marginTop="12dp"
+                            app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+                            app:layout_constraintTop_toBottomOf="@+id/view_line"
+                            android:layout_height="40dp"/>
+
+                        <TextView
+                            app:layout_constraintBottom_toTopOf="@+id/iv_course_tag"
+                            android:id="@+id/tv_teacher_name"
+                            tools:text="老师昵称"
+                            android:includeFontPadding="false"
+                            android:textSize="@dimen/sp_15"
+                            android:textColor="@color/color_333333"
+                            android:layout_marginStart="10dp"
+                            app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+                            app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"/>
+
+                        <ImageView
+                            android:layout_marginTop="3dp"
+                            android:id="@+id/iv_course_tag"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+                            android:src="@drawable/icon_course_completed_tag"
+                            app:layout_constraintLeft_toLeftOf="@+id/tv_teacher_name"
+                            app:layout_constraintTop_toBottomOf="@+id/tv_teacher_name" />
+
+                        <TextView
+                            android:layout_marginStart="4dp"
+                            android:id="@+id/tv_course_completed_title"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:includeFontPadding="false"
+                            android:text="已上课时"
+                            android:textColor="@color/color_999999"
+                            android:textSize="@dimen/sp_12"
+                            app:layout_constraintBottom_toBottomOf="@+id/iv_course_tag"
+                            app:layout_constraintTop_toTopOf="@+id/iv_course_tag"
+                            app:layout_constraintLeft_toRightOf="@+id/iv_course_tag"
+                            />
+
+
+                        <TextView
+                            android:id="@+id/tv_course_completed_value"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:includeFontPadding="false"
+                            android:paddingStart="3dp"
+                            android:paddingEnd="3dp"
+                            android:text="0"
+                            android:textColor="@color/color_2dc7aa"
+                            android:textSize="@dimen/sp_12"
+                            android:textStyle="bold"
+                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_course_completed_title"
+                            app:layout_constraintLeft_toRightOf="@+id/tv_course_completed_title" />
+
+                        <TextView
+                            android:id="@+id/tv_course_total_title"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:includeFontPadding="false"
+                            android:text="/总课时"
+                            android:textColor="@color/color_999999"
+                            android:textSize="@dimen/sp_12"
+                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_course_completed_title"
+                            app:layout_constraintLeft_toRightOf="@+id/tv_course_completed_value" />
+
+
+                        <TextView
+                            android:id="@+id/tv_course_total_value"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:includeFontPadding="false"
+                            android:paddingStart="3dp"
+                            android:paddingEnd="3dp"
+                            android:text="0"
+                            android:textColor="@color/color_333333"
+                            android:textSize="@dimen/sp_12"
+                            android:textStyle="bold"
+                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_course_completed_title"
+                            app:layout_constraintLeft_toRightOf="@+id/tv_course_total_title" />
+
+
+                        <TextView
+                            android:id="@+id/tv_price"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="¥120"
+                            android:textColor="@color/color_f44541"
+                            android:textSize="@dimen/sp_20"
+                            android:textStyle="bold"
+                            android:includeFontPadding="false"
+                            app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+                            app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+                            app:layout_constraintRight_toLeftOf="@+id/tv_price_unit" />
+
+                        <TextView
+                            android:includeFontPadding="false"
+                            android:id="@+id/tv_price_unit"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:paddingStart="2dp"
+                            android:text="/4课时"
+                            android:layout_marginEnd="14dp"
+                            android:textColor="@color/color_999999"
+                            android:textSize="@dimen/sp_12"
+                            app:layout_constraintRight_toRightOf="parent"
+                            app:layout_constraintBaseline_toBaselineOf="@+id/tv_price" />
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginStart="5dp"
+                            android:src="@drawable/icon_chat_small"
+                            android:visibility="gone"
+                            app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+                            app:layout_constraintLeft_toRightOf="@+id/tv_title"
+                            app:layout_constraintTop_toTopOf="@+id/tv_title" />
+
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+
+                    <androidx.constraintlayout.widget.ConstraintLayout
+                        android:id="@+id/cs_course_plan"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="12dp"
+                        android:background="@drawable/shape_white_8dp"
+                        android:padding="12dp"
+                        android:layout_marginStart="14dp"
+                        android:layout_marginEnd="14dp"
+                        android:visibility="gone"
+                        tools:visibility="visible"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/cs_header">
+
+                        <TextView
+                            android:id="@+id/tv_plan_title"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:drawableStart="@drawable/icon_course_group_plan_tag"
+                            android:drawablePadding="6dp"
+                            android:gravity="center"
+                            android:includeFontPadding="false"
+                            android:text="课程介绍"
+                            android:textColor="@color/color_333333"
+                            android:textSize="@dimen/sp_15"
+                            app:layout_constraintLeft_toLeftOf="parent"
+                            app:layout_constraintTop_toTopOf="parent" />
+
+                        <TextView
+                            android:visibility="gone"
+                            android:id="@+id/tv_edit_plan"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:drawableStart="@drawable/icon_course_group_edit_plan"
+                            android:drawablePadding="2dp"
+                            android:gravity="center"
+                            android:includeFontPadding="false"
+                            android:text="修改"
+                            android:textColor="@color/color_777777"
+                            android:textSize="@dimen/sp_13"
+                            app:layout_constraintRight_toRightOf="parent"
+                            app:layout_constraintTop_toTopOf="@+id/tv_plan_title" />
+
+                        <androidx.core.widget.NestedScrollView
+                            android:layout_marginTop="12dp"
+                            android:id="@+id/sc_course_plan"
+                            android:scrollbars="vertical"
+                            android:fadeScrollbars="false"
+                            android:scrollbarThumbVertical="@drawable/shape_e2e2e2_2dp"
+                            android:scrollbarStyle="outsideInset"
+                            app:layout_constraintLeft_toLeftOf="parent"
+                            app:layout_constraintRight_toRightOf="parent"
+                            app:layout_constraintTop_toBottomOf="@+id/tv_plan_title"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content">
+                            <TextView
+                                android:id="@+id/tv_plan_content"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:includeFontPadding="false"
+                                android:textColor="@color/color_777777"
+                                android:textSize="@dimen/sp_13"
+                                app:layout_constraintLeft_toLeftOf="parent"
+                                app:layout_constraintRight_toRightOf="parent"
+                                app:layout_constraintTop_toBottomOf="@+id/tv_plan_title"
+                                tools:text="中国院长笛四级考中国院长笛四级考级曲目教学中国院长笛四级考级曲目中国院长笛四级考级曲目教学中国院长笛四级考级曲目中国院长笛四级考级曲目教学中国院长笛四级考级曲目中国院长笛四级考级曲目教学中国院长笛四级考级曲目中国院长笛四级考级曲目教学中国院长笛四级考级曲目级曲目教学中国院长笛四级考级曲目" />
+                        </androidx.core.widget.NestedScrollView>
+
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+                </androidx.constraintlayout.widget.ConstraintLayout>
+            </com.google.android.material.appbar.CollapsingToolbarLayout>
+
+            <FrameLayout
+                android:id="@+id/fl_tab"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <com.google.android.material.tabs.TabLayout
+                    android:id="@+id/tablayout"
+                    android:layout_width="wrap_content"
+                    android:layout_height="@dimen/dp_44"
+                    android:layout_gravity="center_horizontal"
+                    android:scrollbars="none"
+                    app:layout_constraintLeft_toLeftOf="parent"
+                    app:layout_constraintRight_toRightOf="parent"
+                    app:layout_constraintTop_toBottomOf="@+id/toolbar_include"
+                    app:tabBackground="@null"
+                    app:tabGravity="fill"
+                    app:tabIndicator="@drawable/tab_indicator"
+                    app:tabIndicatorColor="@color/color_2dc7aa"
+                    app:tabIndicatorFullWidth="false"
+                    app:tabIndicatorHeight="4dp"
+                    app:tabMode="scrollable"
+                    app:tabPaddingEnd="0dp"
+                    app:tabPaddingStart="0dp"
+                    app:tabRippleColor="@null"
+                    app:tabSelectedTextColor="@color/black_333"
+                    app:tabTextAppearance="@style/tab_layout_style"
+                    app:tabTextColor="@color/color_666666" />
+            </FrameLayout>
+        </com.google.android.material.appbar.AppBarLayout>
+
+        <androidx.viewpager2.widget.ViewPager2
+            android:id="@+id/view_pager"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_behavior="@string/appbar_scrolling_view_behavior"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tab_layout" />
+
+    </androidx.coordinatorlayout.widget.CoordinatorLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 117 - 0
teacher/src/main/res/layout/fg_group_course_group_detail_layout.xml

@@ -0,0 +1,117 @@
+<?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="match_parent">
+
+    <View
+        android:id="@+id/view_tab_bg"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <LinearLayout
+        android:id="@+id/ll_filter"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="14dp"
+        android:layout_marginTop="12dp"
+        android:layout_marginEnd="14dp"
+        android:orientation="horizontal"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <FrameLayout
+            android:visibility="gone"
+            android:id="@+id/fl_time"
+            android:layout_width="0dp"
+            android:layout_height="22dp"
+            android:layout_marginEnd="11dp"
+            android:layout_weight="0.4"
+            android:background="@drawable/bg_white_4dp">
+
+            <TextView
+                android:id="@+id/tv_time"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:drawableRight="@drawable/icon_arrow_down"
+                android:drawablePadding="4dp"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:maxLines="1"
+                android:text="@string/all_attendance_str"
+                android:textColor="@color/color_131415"
+                android:textSize="@dimen/sp_14"
+                tools:text="2024年10月" />
+        </FrameLayout>
+
+        <FrameLayout
+            android:id="@+id/fl_status"
+            android:layout_width="0dp"
+            android:layout_height="26dp"
+            android:layout_marginEnd="11dp"
+            android:layout_weight="0.3"
+            android:background="@drawable/bg_white_4dp">
+
+            <TextView
+                android:id="@+id/tv_course_status"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:background="@drawable/bg_white_10dp"
+                android:drawableRight="@drawable/icon_arrow_down"
+                android:drawablePadding="4dp"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:maxLines="1"
+                android:text="@string/all_course_status_str"
+                android:textColor="@color/color_131415"
+                android:textSize="@dimen/sp_14"
+                tools:text="全部状态" />
+
+        </FrameLayout>
+
+        <FrameLayout
+            android:id="@+id/fl_attendance"
+            android:layout_width="0dp"
+            android:layout_height="26dp"
+            android:layout_weight="0.3"
+            android:background="@drawable/bg_white_4dp">
+
+            <TextView
+                android:id="@+id/tv_attendance_status"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"
+                android:background="@drawable/bg_white_10dp"
+                android:drawableRight="@drawable/icon_arrow_down"
+                android:drawablePadding="4dp"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:maxLines="1"
+                android:text="@string/all_attendance_str"
+                android:textColor="@color/color_131415"
+                android:textSize="@dimen/sp_14"
+                tools:text="全部考勤" />
+        </FrameLayout>
+    </LinearLayout>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="12dp"
+        android:overScrollMode="never"
+        android:scrollbars="none"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/ll_filter" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 13 - 0
teacher/src/main/res/layout/fg_group_course_group_detail_student_list_layout.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:paddingTop="12dp"
+    android:layout_height="match_parent">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:overScrollMode="never"
+        android:scrollbars="none" />
+</FrameLayout>

+ 9 - 8
teacher/src/main/res/layout/fg_piano_course_group_detail_layout.xml

@@ -18,20 +18,21 @@
         android:id="@+id/ll_filter"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginStart="21dp"
+        android:layout_marginStart="14dp"
         android:layout_marginTop="12dp"
-        android:layout_marginEnd="21dp"
+        android:layout_marginEnd="14dp"
         android:orientation="horizontal"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 
         <FrameLayout
+            android:visibility="gone"
             android:id="@+id/fl_time"
             android:layout_width="0dp"
             android:layout_height="22dp"
             android:layout_marginEnd="11dp"
             android:layout_weight="0.4"
-            android:background="@drawable/bg_white_10dp">
+            android:background="@drawable/bg_white_4dp">
 
             <TextView
                 android:id="@+id/tv_time"
@@ -53,10 +54,10 @@
         <FrameLayout
             android:id="@+id/fl_status"
             android:layout_width="0dp"
-            android:layout_height="22dp"
+            android:layout_height="26dp"
             android:layout_marginEnd="11dp"
             android:layout_weight="0.3"
-            android:background="@drawable/bg_white_10dp">
+            android:background="@drawable/bg_white_4dp">
 
             <TextView
                 android:id="@+id/tv_course_status"
@@ -73,16 +74,16 @@
                 android:text="@string/all_course_status_str"
                 android:textColor="@color/color_131415"
                 android:textSize="@dimen/sp_14"
-                tools:text="全部考勤" />
+                tools:text="全部状态" />
 
         </FrameLayout>
 
         <FrameLayout
             android:id="@+id/fl_attendance"
             android:layout_width="0dp"
-            android:layout_height="22dp"
+            android:layout_height="26dp"
             android:layout_weight="0.3"
-            android:background="@drawable/bg_white_10dp">
+            android:background="@drawable/bg_white_4dp">
 
             <TextView
                 android:id="@+id/tv_attendance_status"

+ 197 - 0
teacher/src/main/res/layout/item_group_course_group_course_layout.xml

@@ -0,0 +1,197 @@
+<?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:layout_marginStart="14dp"
+    android:layout_marginEnd="14dp"
+    android:layout_marginBottom="12dp"
+    android:background="@drawable/bg_white_10dp"
+    android:paddingStart="12dp"
+    android:paddingEnd="12dp"
+    android:paddingBottom="12dp">
+
+    <ImageView
+        android:id="@+id/iv_clock_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:src="@drawable/icon_clock"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/tv_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_clock_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_clock_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_clock_icon"
+        tools:text="2021/09/17 14:00~14:25" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="0dp"
+        android:layout_height="1dp"
+        android:layout_marginTop="15dp"
+        android:background="@color/color_f2f2f2"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/iv_clock_icon" />
+
+    <ImageView
+        android:id="@+id/iv_avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_marginTop="12dp"
+        android:src="@drawable/icon_group_course_avatar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
+        app:qmui_corner_radius="5dp" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_1a1a1a"
+        android:textSize="@dimen/sp_15"
+        app:layout_constraintBottom_toTopOf="@+id/tv_name"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintRight_toLeftOf="@+id/iv_attendance_status"
+        app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+        app:layout_constraintVertical_chainStyle="packed"
+        app:layout_constraintWidth_default="wrap"
+        tools:text="VIP定制课-张豆豆VIP定制课-张豆豆" />
+
+    <ImageView
+        android:id="@+id/iv_attendance_status"
+        android:layout_width="wrap_content"
+        android:adjustViewBounds="true"
+        android:layout_height="17.1dp"
+        android:layout_marginStart="5dp"
+        android:layout_marginEnd="5dp"
+        android:src="@drawable/icon_course_attendance_truancy"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintLeft_toRightOf="@+id/tv_title"
+        app:layout_constraintRight_toLeftOf="@+id/iv_arrow"
+        app:layout_constraintTop_toTopOf="@+id/tv_title" />
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="4dp"
+        android:ellipsize="middle"
+        android:includeFontPadding="false"
+        android:singleLine="true"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+        app:layout_constraintRight_toLeftOf="@+id/tv_course_name"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title"
+        app:layout_constraintWidth_default="wrap"
+        tools:text="张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆张豆豆" />
+
+    <TextView
+        tools:visibility="visible"
+        android:visibility="gone"
+        android:layout_marginTop="12dp"
+        android:layout_marginEnd="12dp"
+        android:layout_marginStart="12dp"
+        app:layout_constraintTop_toBottomOf="@+id/iv_avatar"
+        android:id="@+id/tv_des"
+        android:padding="6dp"
+        tools:text="严琦老师带您零基础学习大号,通过4节课的学习掌握大号演奏的基本方式,培养良好的吐息习惯。"
+        android:textColor="@color/color_777777"
+        android:textSize="@dimen/sp_13"
+        android:background="@drawable/shape_f8f8f8_6dp"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"/>
+
+    <ImageView
+        android:id="@+id/iv_go_chat"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="5dp"
+        android:src="@drawable/icon_chat_small"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintLeft_toRightOf="@+id/tv_title"
+        app:layout_constraintTop_toTopOf="@+id/tv_title" />
+
+    <TextView
+        android:id="@+id/tv_course_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="5dp"
+        android:layout_marginEnd="5dp"
+        android:background="@drawable/shape_couse_type_text_bg"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingStart="4dp"
+        android:paddingTop="1.5dp"
+        android:paddingEnd="4dp"
+        android:paddingBottom="1.5dp"
+        android:textColor="@color/color_ff8c00"
+        android:textSize="@dimen/sp_10"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_name"
+        app:layout_constraintLeft_toRightOf="@+id/tv_name"
+        app:layout_constraintRight_toLeftOf="@+id/iv_arrow"
+        app:layout_constraintTop_toTopOf="@+id/tv_name"
+        tools:text="单簧管" />
+
+
+    <TextView
+        android:id="@+id/tv_course_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toTopOf="@+id/view_line"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="未开始" />
+
+    <TextView
+        android:id="@+id/tv_go_start"
+        android:layout_width="wrap_content"
+        android:layout_height="22dp"
+        android:background="@drawable/shape_2dc7aa_11dp"
+        android:gravity="center"
+        android:paddingStart="8dp"
+        android:paddingEnd="8dp"
+        android:text="开始上课"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_12"
+        android:visibility="gone"
+        app:layout_constraintBottom_toTopOf="@+id/view_line"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="开始上课" />
+
+    <ImageView
+        android:id="@+id/iv_arrow"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/icon_arrow_right"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/iv_avatar" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 75 - 0
teacher/src/main/res/layout/item_group_course_group_student_layout.xml

@@ -0,0 +1,75 @@
+<?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:id="@+id/cs_root"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginStart="14dp"
+    android:layout_marginEnd="14dp"
+    android:background="@drawable/bg_white_10dp"
+    android:paddingStart="12dp"
+    android:paddingTop="12dp"
+    android:paddingEnd="12dp"
+    android:paddingBottom="12dp">
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/iv_avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:src="@drawable/icon_default_head"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:qmui_corner_radius="5dp" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="5dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toTopOf="@+id/tv_course_name"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintRight_toLeftOf="@+id/iv_go_chat"
+        app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+        app:layout_constraintVertical_chainStyle="packed"
+        tools:text="VIP定制课-张豆豆VIP定制课-张豆豆" />
+
+
+    <TextView
+        android:id="@+id/tv_course_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="3dp"
+        android:background="@drawable/shape_couse_type_text_bg"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingStart="4dp"
+        android:paddingTop="1.5dp"
+        android:paddingEnd="4dp"
+        android:paddingBottom="1.5dp"
+        android:textColor="@color/color_ff8c00"
+        android:textSize="@dimen/sp_10"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title"
+        tools:text="单簧管" />
+
+    <ImageView
+        android:id="@+id/iv_go_chat"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="5dp"
+        android:src="@drawable/icon_chat_small"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>