Browse Source

增加约课页面直播课和视频课数据

Pq 3 months ago
parent
commit
97bd836172
31 changed files with 1410 additions and 211 deletions
  1. 2 3
      BaseLibrary/src/main/res/layout/item_common_sort_view_layout.xml
  2. 1 1
      chatModule/src/main/java/com/cooleshow/chatmodule/ui/NoticeActivity.java
  3. 47 0
      student/src/main/java/com/cooleshow/student/adapter/LiveCourseAppointAdapter.java
  4. 12 0
      student/src/main/java/com/cooleshow/student/adapter/MineCoursePagerAdapter.java
  5. 67 0
      student/src/main/java/com/cooleshow/student/adapter/VideoCourseAppointAdapter.java
  6. 11 0
      student/src/main/java/com/cooleshow/student/api/APIService.java
  7. 315 0
      student/src/main/java/com/cooleshow/student/bean/LiveCourseAppointListBean.java
  8. 167 52
      student/src/main/java/com/cooleshow/student/bean/VideoCourseListBean.java
  9. 17 0
      student/src/main/java/com/cooleshow/student/bean/request/LiveCourseEntry.java
  10. 5 1
      student/src/main/java/com/cooleshow/student/contract/LiveCourseAppointListContract.java
  11. 6 1
      student/src/main/java/com/cooleshow/student/contract/VideoCourseAppointListContract.java
  12. 15 18
      student/src/main/java/com/cooleshow/student/presenter/course/LiveCourseAppointListPresenter.java
  13. 12 10
      student/src/main/java/com/cooleshow/student/presenter/course/VideoCourseAppointListPresenter.java
  14. 1 3
      student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java
  15. 2 1
      student/src/main/java/com/cooleshow/student/ui/course/InterestCorrectionCourseListFragment.java
  16. 182 2
      student/src/main/java/com/cooleshow/student/ui/course/LiveCourseAppointListFragment.java
  17. 2 1
      student/src/main/java/com/cooleshow/student/ui/course/VIPCustomCourseListFragment.java
  18. 193 2
      student/src/main/java/com/cooleshow/student/ui/course/VideoCourseAppointListFragment.java
  19. 1 1
      student/src/main/java/com/cooleshow/student/ui/main/MusicHallFragment.java
  20. BIN
      student/src/main/res/drawable-xhdpi/icon_live_course_time_tag.png
  21. BIN
      student/src/main/res/drawable-xxhdpi/icon_live_course_time_tag.png
  22. 6 0
      student/src/main/res/drawable/shape_ffe7e7_15dp_left.xml
  23. 4 6
      student/src/main/res/layout/activity_appointment_course.xml
  24. 2 4
      student/src/main/res/layout/fg_interest_correction_course_list_layout.xml
  25. 11 51
      student/src/main/res/layout/fg_live_course_appoint_list_layout.xml
  26. 11 51
      student/src/main/res/layout/fg_video_course_appoint_list_layout.xml
  27. 1 1
      student/src/main/res/layout/fg_vip_custom_course_list_layout.xml
  28. 163 0
      student/src/main/res/layout/item_live_course_appoint_layout.xml
  29. 152 0
      student/src/main/res/layout/item_video_course_appoint_layout.xml
  30. 1 1
      teacher/src/main/java/com/cooleshow/teacher/adapter/MineVideoCourseAdapter.java
  31. 1 1
      teacher/src/main/java/com/cooleshow/teacher/presenter/homePage/LiveCoursePagePresenter.java

+ 2 - 3
BaseLibrary/src/main/res/layout/item_common_sort_view_layout.xml

@@ -1,17 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
+    android:layout_height="28dp"
     android:id="@+id/cs_root"
     android:paddingStart="8dp"
     android:paddingEnd="8dp"
     android:layout_marginEnd="10dp"
-    android:paddingTop="6dp"
-    android:paddingBottom="6dp"
     android:background="@drawable/bg_white_14dp"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto">
     <TextView
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintRight_toLeftOf="@+id/iv_status"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintTop_toTopOf="parent"

+ 1 - 1
chatModule/src/main/java/com/cooleshow/chatmodule/ui/NoticeActivity.java

@@ -83,7 +83,7 @@ public class NoticeActivity extends BaseMVPActivity<TcActivityNoticeBinding, Not
             viewBinding.toolbarInclude.tvRight.setVisibility(View.GONE);
         }
         targetId = getIntent().getStringExtra("targetId");
-        viewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(this).setDrawableSize(20));
+        viewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(this));
         recyclerView = viewBinding.recyclerView;
         floatbutton = viewBinding.floatbutton;
         floatbutton.setOnClickListener(this);

+ 47 - 0
student/src/main/java/com/cooleshow/student/adapter/LiveCourseAppointAdapter.java

@@ -0,0 +1,47 @@
+package com.cooleshow.student.adapter;
+
+import android.text.TextUtils;
+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.GlideUtils;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2024/11/19.
+ */
+public class LiveCourseAppointAdapter extends BaseQuickAdapter<LiveCourseAppointListBean.RowsBean, BaseViewHolder> {
+    public LiveCourseAppointAdapter() {
+        super(R.layout.item_live_course_appoint_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, LiveCourseAppointListBean.RowsBean data) {
+        String timeStr = TextUtils.isEmpty(data.getCourseStartTime()) ? "" : TimeUtils.date2String(TimeUtils.string2Date(data.getCourseStartTime()), "yyyy-MM-dd HH:mm");
+        //时间
+        holder.setText(R.id.tv_time, "开课时间:" + timeStr);
+        //title
+        holder.setText(R.id.tv_title, data.getCourseGroupName());
+        //介绍
+        holder.setText(R.id.tv_des, data.getCourseIntroduce());
+        //subjectName
+        holder.setText(R.id.tv_course_name, data.getSubjectName());
+        //购买人数
+        holder.setText(R.id.tv_buy_num, UiUtils.getBuyNumTip(data.getCoursePrice(), data.getStudentCount()));
+        //课程封面
+        ImageView iv_bg = holder.getView(R.id.iv_bg);
+        GlideUtils.INSTANCE.loadImage(getContext(), data.getBackgroundPic(), iv_bg, com.cooleshow.base.R.drawable.bg_video_placeholder);
+        //价格
+        TextView tv_price = holder.getView(R.id.tv_price);
+        TextView tv_price_unit = holder.getView(R.id.tv_price_unit);
+        tv_price.setText(UiUtils.getLiveCoursePriceText(data.getCoursePrice(), data.getCourseNum()));
+        tv_price_unit.setText(String.format("/%d课时", data.getCourseNum()));
+    }
+}

+ 12 - 0
student/src/main/java/com/cooleshow/student/adapter/MineCoursePagerAdapter.java

@@ -35,4 +35,16 @@ public class MineCoursePagerAdapter extends FragmentStateAdapter {
     public int getItemCount() {
         return mFragments != null ? mFragments.size() : 0;
     }
+
+
+    @Override
+    public long getItemId(int position) {
+        Fragment fragment = mFragments.get(position);
+        return fragment != null ? fragment.hashCode() : super.getItemId(position);
+    }
+
+    @Override
+    public boolean containsItem(long itemId) {
+        return super.containsItem(itemId);
+    }
 }

+ 67 - 0
student/src/main/java/com/cooleshow/student/adapter/VideoCourseAppointAdapter.java

@@ -0,0 +1,67 @@
+package com.cooleshow.student.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.constanst.VideoCoursePayType;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.VideoCourseListBean;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2024/11/19.
+ */
+public class VideoCourseAppointAdapter extends BaseQuickAdapter<VideoCourseListBean.RowsBean, BaseViewHolder> {
+
+    public VideoCourseAppointAdapter() {
+        super(R.layout.item_video_course_appoint_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder helper, VideoCourseListBean.RowsBean item) {
+        //声部名称
+        helper.setText(R.id.course_name, item.getLessonSubjectName());
+        //封面
+        ImageView im_pic = helper.getView(R.id.im_pic);
+        GlideUtils.INSTANCE.loadImage(getContext(), item.getLessonCoverUrl(), im_pic, com.cooleshow.base.R.drawable.bg_video_placeholder);
+        //课程名称
+        TextView tv_title = helper.getView(R.id.tv_title);
+        tv_title.setText(item.getLessonName());
+        //价格
+        TextView tv_price = helper.getView(R.id.tv_price);
+        TextView tv_price_symbol = helper.getView(R.id.tv_price_symbol);
+        boolean isVipType = TextUtils.equals(item.getPayType(), VideoCoursePayType.VIP.getId());
+        if (isVipType) {
+            tv_price_symbol.setVisibility(View.GONE);
+            tv_price.setText("会员");
+            tv_price.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_c76e21));
+        } else {
+            //收费
+            tv_price.setText(UiUtils.getVideoCoursePriceText2(item.getLessonPrice()));
+            if (UiUtils.isFree(item.getLessonPrice())) {
+                tv_price_symbol.setVisibility(View.GONE);
+                tv_price.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_20bea0));
+            } else {
+                tv_price_symbol.setVisibility(View.VISIBLE);
+                tv_price.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_ff0000));
+            }
+        }
+        TextView tv_price_unit = helper.getView(R.id.tv_price_unit);
+        tv_price_unit.setText(String.format("%d课时", item.getLessonCount()));
+        TextView tv_music_num = helper.getView(R.id.tv_music_num);
+        tv_music_num.setText(item.getMusicNum() + "首曲目");
+
+        //老师头像昵称
+        ImageView iv_avatar=helper.getView(R.id.iv_avatar);
+        GlideUtils.INSTANCE.loadImage(getContext(),item.getAvatar(),iv_avatar,R.drawable.icon_teacher_default_head);
+        TextView tv_teacher_name = helper.getView(R.id.tv_teacher_name);
+        tv_teacher_name.setText(item.getUserName());
+    }
+}

+ 11 - 0
student/src/main/java/com/cooleshow/student/api/APIService.java

@@ -25,6 +25,7 @@ import com.cooleshow.student.bean.HomeStyleBean;
 import com.cooleshow.student.bean.HomeworkDetailBean;
 import com.cooleshow.student.bean.HomeworkListBean;
 import com.cooleshow.student.bean.HotAlbumBean;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
 import com.cooleshow.student.bean.LiveCourseListBean;
 import com.cooleshow.student.bean.LiveRoomInfoBean;
 import com.cooleshow.student.bean.PayTestBean;
@@ -39,6 +40,7 @@ import com.cooleshow.student.bean.SparringCourseHomeworkBean;
 import com.cooleshow.student.bean.SystemMessageBean;
 import com.cooleshow.student.bean.TempLiveTeacherListBean;
 import com.cooleshow.student.bean.VideoCourseListBean;
+import com.cooleshow.student.bean.request.LiveCourseEntry;
 import com.cooleshow.usercenter.bean.SetDetailBean;
 import com.cooleshow.usercenter.bean.StudentUserInfo;
 import com.cooleshow.usercenter.bean.UserInfo;
@@ -546,4 +548,13 @@ public interface APIService {
      */
     @POST(STUDENT_GROUP + "courseSchedule/queryTeacherList")
     Observable<BaseResponse<AppointCourseTeacherListBean>> getAppointCourseTeachers(@Body RequestBody body);
+
+    /**
+     * 分页查询直播课课程组列表
+     *
+     * @param body
+     * @return
+     */
+    @POST(STUDENT_GROUP + "courseGroup/queryPageCourseGroup")
+    Observable<BaseResponse<LiveCourseAppointListBean>> queryPageCourseGroup(@Body LiveCourseEntry body);
 }

+ 315 - 0
student/src/main/java/com/cooleshow/student/bean/LiveCourseAppointListBean.java

@@ -0,0 +1,315 @@
+package com.cooleshow.student.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2024/11/19.
+ */
+public class LiveCourseAppointListBean {
+
+
+    /**
+     * footer : []
+     * limit : 20
+     * nextPage : 1
+     * offset : 0
+     * pageNo : 1
+     * prePage : 1
+     * rows : [{"avatar":"https://oss.dayaedu.com/gyt/tenant_boy_head.png","backgroundPic":"https://oss.dayaedu.com/klx/17316608743221731660874319.png","courseGroupId":115,"courseGroupName":"丹丹の直播课程001","courseIntroduce":"","courseNum":5,"coursePrice":300,"courseStartTime":"2024-12-03 14:00:00","existBuy":0,"imGroupId":"","mixStudentNum":2,"reason":"","salesEndDate":"2024-12-02 00:00:00","salesStartDate":"2024-11-15 00:00:00","singleCourseMinutes":30,"status":"APPLY","studentCount":0,"subjectName":"长笛","teacherId":9551,"teacherName":"丹丹","userName":""},{"avatar":"https://oss.dayaedu.com/daya/1695304506013T1WgJaE.png","backgroundPic":"https://oss.dayaedu.com/klx/17319237926191731923792616.png","courseGroupId":126,"courseGroupName":"诶诶诶","courseIntroduce":"","courseNum":4,"coursePrice":12,"courseStartTime":"2024-11-20 09:00:00","existBuy":0,"imGroupId":"","mixStudentNum":2,"reason":"","salesEndDate":"2024-11-19 00:00:00","salesStartDate":"2024-11-18 00:00:00","singleCourseMinutes":60,"status":"APPLY","studentCount":0,"subjectName":"长笛","teacherId":9175,"teacherName":"李霞","userName":""}]
+     * statInfo : null
+     * total : 2
+     * totalPage : 1
+     */
+
+    private int limit;
+    private int nextPage;
+    private int offset;
+    private int pageNo;
+    private int prePage;
+    private int total;
+    private int totalPage;
+    private List<RowsBean> rows;
+
+    public int getLimit() {
+        return limit;
+    }
+
+    public void setLimit(int limit) {
+        this.limit = limit;
+    }
+
+    public int getNextPage() {
+        return nextPage;
+    }
+
+    public void setNextPage(int nextPage) {
+        this.nextPage = nextPage;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }
+
+    public int getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(int pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public int getPrePage() {
+        return prePage;
+    }
+
+    public void setPrePage(int prePage) {
+        this.prePage = prePage;
+    }
+
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+
+    public int getTotalPage() {
+        return totalPage;
+    }
+
+    public void setTotalPage(int totalPage) {
+        this.totalPage = totalPage;
+    }
+
+    public List<RowsBean> getRows() {
+        return rows;
+    }
+
+    public void setRows(List<RowsBean> rows) {
+        this.rows = rows;
+    }
+
+    public static class RowsBean {
+        /**
+         * avatar : https://oss.dayaedu.com/gyt/tenant_boy_head.png
+         * backgroundPic : https://oss.dayaedu.com/klx/17316608743221731660874319.png
+         * courseGroupId : 115
+         * courseGroupName : 丹丹の直播课程001
+         * courseIntroduce :
+         * courseNum : 5
+         * coursePrice : 300.0
+         * courseStartTime : 2024-12-03 14:00:00
+         * existBuy : 0
+         * imGroupId :
+         * mixStudentNum : 2
+         * reason :
+         * salesEndDate : 2024-12-02 00:00:00
+         * salesStartDate : 2024-11-15 00:00:00
+         * singleCourseMinutes : 30
+         * status : APPLY
+         * studentCount : 0
+         * subjectName : 长笛
+         * teacherId : 9551
+         * teacherName : 丹丹
+         * userName :
+         */
+
+        private String avatar;
+        private String backgroundPic;
+        private String courseGroupId;
+        private String courseGroupName;
+        private String courseIntroduce;
+        private int courseNum;
+        private String coursePrice;
+        private String courseStartTime;
+        private int existBuy;
+        private String imGroupId;
+        private int mixStudentNum;
+        private String reason;
+        private String salesEndDate;
+        private String salesStartDate;
+        private String singleCourseMinutes;
+        private String status;
+        private String studentCount;
+        private String subjectName;
+        private String teacherId;
+        private String teacherName;
+        private String userName;
+
+        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 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 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 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 getMixStudentNum() {
+            return mixStudentNum;
+        }
+
+        public void setMixStudentNum(int mixStudentNum) {
+            this.mixStudentNum = mixStudentNum;
+        }
+
+        public String getReason() {
+            return reason;
+        }
+
+        public void setReason(String reason) {
+            this.reason = reason;
+        }
+
+        public String getSalesEndDate() {
+            return salesEndDate;
+        }
+
+        public void setSalesEndDate(String salesEndDate) {
+            this.salesEndDate = salesEndDate;
+        }
+
+        public String getSalesStartDate() {
+            return salesStartDate;
+        }
+
+        public void setSalesStartDate(String salesStartDate) {
+            this.salesStartDate = salesStartDate;
+        }
+
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        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;
+        }
+
+        public String getCourseGroupId() {
+            return courseGroupId;
+        }
+
+        public void setCourseGroupId(String courseGroupId) {
+            this.courseGroupId = courseGroupId;
+        }
+
+        public String getSingleCourseMinutes() {
+            return singleCourseMinutes;
+        }
+
+        public void setSingleCourseMinutes(String singleCourseMinutes) {
+            this.singleCourseMinutes = singleCourseMinutes;
+        }
+
+        public String getStudentCount() {
+            return studentCount;
+        }
+
+        public void setStudentCount(String studentCount) {
+            this.studentCount = studentCount;
+        }
+
+        public String getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(String teacherId) {
+            this.teacherId = teacherId;
+        }
+    }
+}

+ 167 - 52
student/src/main/java/com/cooleshow/student/bean/VideoCourseListBean.java

@@ -30,61 +30,176 @@ public class VideoCourseListBean {
     public List<RowsBean> rows;
 
 
+    public List<RowsBean> getRows() {
+        return rows;
+    }
 
+    public void setRows(List<RowsBean> rows) {
+        this.rows = rows;
+    }
 
     public static class RowsBean {
-        /**
-         * auditId : 0
-         * auditName :
-         * auditStatus :
-         * avatar :
-         * countStudent : 0
-         * createTime :
-         * hotFlag : 0
-         * id : 0
-         * lessonCount : 0
-         * lessonCoverUrl :
-         * lessonDesc :
-         * lessonName :
-         * lessonPrice : 0
-         * lessonSubject :
-         * lessonSubjectName :
-         * lessonTag :
-         * sortNumber : 0
-         * teacherId : 0
-         * topFlag : 0
-         * updateTime :
-         * username :
-         */
-
-        /*
-        	"avatar": "",
-				"countStudent": 0,
-				"id": 0,
-				"lessonCount": 0,
-				"lessonCoverUrl": "",
-				"lessonDesc": "",
-				"lessonName": "",
-				"lessonPrice": 0,
-				"lessonSubject": "",
-				"lessonSubjectName": "",
-				"realName": "",
-				"teacherId": 0,
-				"userName": ""
-         */
-        public String avatar;
-        public int countStudent;
-        public int id;
-        public int lessonCount;
-        public String lessonCoverUrl;
-        public String lessonDesc;
-        public String lessonName;
-        public double lessonPrice;
-        public String lessonSubject;
-        public String lessonSubjectName;
-        public String realName;
-        public int teacherId;
-        public String username;
+        private int auditVersion;
+        private String avatar;
+        private String countStudent;
+        private String id;
+        private int lessonCount;
+        private String lessonCoverUrl;
+        private String lessonDesc;
+        private String lessonName;
+        private String lessonPrice;
+        private String lessonSubject;
+        private String lessonSubjectName;
+        private String payType;
+        private String realName;
+        private String relationType;
+        private String teacherId;
+        private String userName;
+        private int virtualNumber;
+        public String musicNum;
+
+        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 getCountStudent() {
+            return countStudent;
+        }
+
+        public void setCountStudent(String countStudent) {
+            this.countStudent = countStudent;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public int getLessonCount() {
+            return lessonCount;
+        }
+
+        public void setLessonCount(int lessonCount) {
+            this.lessonCount = lessonCount;
+        }
+
+        public String getLessonCoverUrl() {
+            return lessonCoverUrl;
+        }
+
+        public void setLessonCoverUrl(String lessonCoverUrl) {
+            this.lessonCoverUrl = lessonCoverUrl;
+        }
+
+        public String getLessonDesc() {
+            return lessonDesc;
+        }
+
+        public void setLessonDesc(String lessonDesc) {
+            this.lessonDesc = lessonDesc;
+        }
+
+        public String getLessonName() {
+            return lessonName;
+        }
+
+        public void setLessonName(String lessonName) {
+            this.lessonName = lessonName;
+        }
+
+        public String getLessonPrice() {
+            return lessonPrice;
+        }
+
+        public void setLessonPrice(String lessonPrice) {
+            this.lessonPrice = lessonPrice;
+        }
+
+        public String getLessonSubject() {
+            return lessonSubject;
+        }
+
+        public void setLessonSubject(String lessonSubject) {
+            this.lessonSubject = lessonSubject;
+        }
+
+        public String getLessonSubjectName() {
+            return lessonSubjectName;
+        }
+
+        public void setLessonSubjectName(String lessonSubjectName) {
+            this.lessonSubjectName = lessonSubjectName;
+        }
+
+        public String getPayType() {
+            return payType;
+        }
+
+        public void setPayType(String payType) {
+            this.payType = payType;
+        }
+
+        public String getRealName() {
+            return realName;
+        }
+
+        public void setRealName(String realName) {
+            this.realName = realName;
+        }
+
+        public String getRelationType() {
+            return relationType;
+        }
+
+        public void setRelationType(String relationType) {
+            this.relationType = relationType;
+        }
+
+        public String getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(String teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public String getUserName() {
+            return userName;
+        }
+
+        public void setUserName(String userName) {
+            this.userName = userName;
+        }
+
+        public int getVirtualNumber() {
+            return virtualNumber;
+        }
+
+        public void setVirtualNumber(int virtualNumber) {
+            this.virtualNumber = virtualNumber;
+        }
+
+        public String getMusicNum() {
+            return musicNum;
+        }
 
+        public void setMusicNum(String musicNum) {
+            this.musicNum = musicNum;
+        }
     }
 }

+ 17 - 0
student/src/main/java/com/cooleshow/student/bean/request/LiveCourseEntry.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.bean.request;
+
+/**
+ * @author dengqw
+ * @time 2022/6/28 22:44
+ * @describe:
+ **/
+public class LiveCourseEntry {
+    public String classDate;
+    public int page;
+    public int rows;
+    public String groupStatus;
+    public String subjectId;
+    public String subjectName;
+    public boolean myself;
+    public String search;
+}

+ 5 - 1
student/src/main/java/com/cooleshow/student/contract/LiveCourseAppointListContract.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
 
 /**
  * Author by pq, Date on 2022/4/20.
@@ -9,9 +10,12 @@ public interface LiveCourseAppointListContract {
 
     interface View extends BaseView {
 
+        void onGetLiveCourseSuccess(int page, LiveCourseAppointListBean data);
+
+        void onGetLiveCourseError(int page);
+
     }
 
     interface Presenter {
-        void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page);
     }
 }

+ 6 - 1
student/src/main/java/com/cooleshow/student/contract/VideoCourseAppointListContract.java

@@ -1,6 +1,8 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.bean.VideoCourseListBean;
 
 /**
  * Author by pq, Date on 2022/4/20.
@@ -9,9 +11,12 @@ public interface VideoCourseAppointListContract {
 
     interface View extends BaseView {
 
+        void onGetVideoCourseSuccess(int page, VideoCourseListBean data);
+
+        void onGetCourseError(int page);
+
     }
 
     interface Presenter {
-        void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page);
     }
 }

+ 15 - 18
student/src/main/java/com/cooleshow/student/presenter/course/LiveCourseAppointListPresenter.java

@@ -1,11 +1,14 @@
 package com.cooleshow.student.presenter.course;
 
+import com.cooleshow.base.bean.SubjectListBean;
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
 import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
 import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.bean.request.LiveCourseEntry;
 import com.cooleshow.student.contract.InterestCorrectionCourseListContract;
 import com.cooleshow.student.contract.LiveCourseAppointListContract;
 
@@ -18,28 +21,22 @@ import org.json.JSONObject;
  */
 public class LiveCourseAppointListPresenter extends BasePresenter<LiveCourseAppointListContract.View> implements LiveCourseAppointListContract.Presenter {
 
-    @Override
-    public void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page) {
+    public void queryLiveCourse(boolean isShowLoading,String subjectId, String search,int page) {
         if (isShowLoading && getView() != null) {
             getView().showLoading();
         }
-        JSONObject jsonObject = new JSONObject();
-        try {
-            if (subjectId != 0) {
-                jsonObject.putOpt("subjectId", subjectId);
-            }
-            jsonObject.putOpt("platform", "android");
-            jsonObject.putOpt("version", "1");
-            jsonObject.putOpt("page", page);
-            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
-        addSubscribe(create(APIService.class).selectMyGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SelectMyGroupBean>(getView()) {
+        LiveCourseEntry liveCourseEntry =new LiveCourseEntry();
+        liveCourseEntry.page =page;
+        liveCourseEntry.rows =Constants.DEFAULT_DATA_SIZE;
+        liveCourseEntry.subjectId = subjectId;
+        liveCourseEntry.myself=false;
+        liveCourseEntry.groupStatus ="APPLY";
+        liveCourseEntry.search=search;
+        addSubscribe(create(APIService.class).queryPageCourseGroup(liveCourseEntry), new BaseObserver<LiveCourseAppointListBean>(getView()) {
             @Override
-            protected void onSuccess(SelectMyGroupBean data) {
+            protected void onSuccess(LiveCourseAppointListBean data) {
                 if (getView() != null) {
-//                    getView().onGetVideoCourseSuccess(page, data);
+                    getView().onGetLiveCourseSuccess(page, data);
                 }
             }
 
@@ -47,7 +44,7 @@ public class LiveCourseAppointListPresenter extends BasePresenter<LiveCourseAppo
             public void onError(Throwable e) {
                 super.onError(e);
                 if (getView() != null) {
-//                    getView().onGetCourseError(page);
+                    getView().onGetLiveCourseError(page);
                 }
             }
         });

+ 12 - 10
student/src/main/java/com/cooleshow/student/presenter/course/VideoCourseAppointListPresenter.java

@@ -1,11 +1,14 @@
 package com.cooleshow.student.presenter.course;
 
+import android.text.TextUtils;
+
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
 import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.student.api.APIService;
 import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.bean.VideoCourseListBean;
 import com.cooleshow.student.contract.LiveCourseAppointListContract;
 import com.cooleshow.student.contract.VideoCourseAppointListContract;
 
@@ -18,28 +21,27 @@ import org.json.JSONObject;
  */
 public class VideoCourseAppointListPresenter extends BasePresenter<VideoCourseAppointListContract.View> implements VideoCourseAppointListContract.Presenter {
 
-    @Override
-    public void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page) {
+    public void queryVideoCourse(boolean isShowLoading, String subjectId, String search, int page) {
         if (isShowLoading && getView() != null) {
             getView().showLoading();
         }
         JSONObject jsonObject = new JSONObject();
         try {
-            if (subjectId != 0) {
-                jsonObject.putOpt("subjectId", subjectId);
+            if (!TextUtils.isEmpty(subjectId)) {
+                jsonObject.putOpt("lessonSubject", subjectId);
             }
-            jsonObject.putOpt("platform", "android");
-            jsonObject.putOpt("version", "1");
+            jsonObject.putOpt("search", search);
+            jsonObject.putOpt("myself", false);
             jsonObject.putOpt("page", page);
             jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
         } catch (JSONException e) {
             e.printStackTrace();
         }
-        addSubscribe(create(APIService.class).selectMyGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SelectMyGroupBean>(getView()) {
+        addSubscribe(create(APIService.class).getVideoCourses(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<VideoCourseListBean>(getView()) {
             @Override
-            protected void onSuccess(SelectMyGroupBean data) {
+            protected void onSuccess(VideoCourseListBean data) {
                 if (getView() != null) {
-//                    getView().onGetVideoCourseSuccess(page, data);
+                    getView().onGetVideoCourseSuccess(page, data);
                 }
             }
 
@@ -47,7 +49,7 @@ public class VideoCourseAppointListPresenter extends BasePresenter<VideoCourseAp
             public void onError(Throwable e) {
                 super.onError(e);
                 if (getView() != null) {
-//                    getView().onGetCourseError(page);
+                    getView().onGetCourseError(page);
                 }
             }
         });

+ 1 - 3
student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java

@@ -54,9 +54,7 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "约课");
         viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
         tabLayout = viewBinding.tablayout;
-        viewPager = viewBinding.viewpager;
-        viewPager.setCurrentItem(0);
-
+        viewPager = viewBinding.viewPager;
     }
 
     @Override

+ 2 - 1
student/src/main/java/com/cooleshow/student/ui/course/InterestCorrectionCourseListFragment.java

@@ -66,6 +66,7 @@ public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInte
 
     @Override
     protected void initView(View rootView) {
+        mViewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(getContext()));
     }
 
     @Override
@@ -99,7 +100,6 @@ public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInte
     private void initListener() {
         mViewBinding.tvFilter.setOnClickListener(this);
         mViewBinding.tvSearch.setOnClickListener(this);
-        mViewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(getContext()).setDrawableSize(20));
         mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
             @Override
             public void onRefresh(@NonNull RefreshLayout refreshLayout) {
@@ -241,6 +241,7 @@ public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInte
 
     private void checkHasNext(int dataSize) {
         hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
     }
 
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {

+ 182 - 2
student/src/main/java/com/cooleshow/student/ui/course/LiveCourseAppointListFragment.java

@@ -1,8 +1,20 @@
 package com.cooleshow.student.ui.course;
 
+import android.graphics.Color;
 import android.view.View;
+import android.widget.TextView;
 
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.listener.OnDismissListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.LiveCourseAppointAdapter;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
 import com.cooleshow.student.bean.QuerySubjectBean;
 import com.cooleshow.student.contract.InterestCorrectionCourseListContract;
 import com.cooleshow.student.contract.LiveCourseAppointListContract;
@@ -10,16 +22,30 @@ import com.cooleshow.student.databinding.FgInterestCorrectionCourseListLayoutBin
 import com.cooleshow.student.databinding.FgLiveCourseAppointListLayoutBinding;
 import com.cooleshow.student.presenter.course.InterestCorrectionCourseListPresenter;
 import com.cooleshow.student.presenter.course.LiveCourseAppointListPresenter;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
 /**
  * Author by pq, Date on 2024/11/13.
  * 直播课约课
  */
-public class LiveCourseAppointListFragment extends BaseMVPFragment<FgLiveCourseAppointListLayoutBinding, LiveCourseAppointListPresenter> implements LiveCourseAppointListContract.View {
+public class LiveCourseAppointListFragment extends BaseMVPFragment<FgLiveCourseAppointListLayoutBinding, LiveCourseAppointListPresenter> implements LiveCourseAppointListContract.View, View.OnClickListener {
     private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+    private LiveCourseAppointAdapter mAdapter;
+    private OptionsPickerView pvOptions;
+    private int currentSelectSubjectPosition = -1;
+    private String currentSubjectId;
+    private int currentPage = 1;
+    private boolean hasNext = true;
+    private String searchCondition;
 
     public static LiveCourseAppointListFragment newInstance() {
         LiveCourseAppointListFragment fragment = new LiveCourseAppointListFragment();
@@ -38,17 +64,171 @@ public class LiveCourseAppointListFragment extends BaseMVPFragment<FgLiveCourseA
 
     @Override
     protected void initData() {
+        currentSubjectId = UserHelper.getSubjectId();
+        String subjectName = UserHelper.getSubjectName();
+        mViewBinding.tvFilter.setText(subjectName);
+
+        mAdapter = new LiveCourseAppointAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
+        mAdapter.setEmptyView(emptyViewLayout);
+        mViewBinding.recyclerViewList.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerViewList.setAdapter(mAdapter);
+        initListener();
+        getData(false);
+    }
 
+    private void initListener() {
+        mViewBinding.tvFilter.setOnClickListener(this);
+        mViewBinding.tvSearch.setOnClickListener(this);
+        mViewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(getContext()));
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                getData(false);
+            }
+        });
+        mViewBinding.refreshLayout.setOnLoadMoreListener(new com.scwang.smart.refresh.layout.listener.OnLoadMoreListener() {
+            @Override
+            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    getData(false);
+                } else {
+                    mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                }
+            }
+        });
     }
 
     @Override
     protected LiveCourseAppointListPresenter createPresenter() {
         return new LiveCourseAppointListPresenter();
     }
+
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
         subjectBeanList.clear();
-        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
         subjectBeanList.addAll(data);
     }
 
+    @Override
+    public void onGetLiveCourseSuccess(int page, LiveCourseAppointListBean dataList) {
+        if (isDetached()) {
+            return;
+        }
+        LOG.i("pq", "onGetLiveCourseSuccess:" + dataList);
+        if (dataList != null) {
+            if (page == 1) {
+                //第一页
+                mViewBinding.refreshLayout.finishRefresh();
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (dataList.getRows() != null && dataList.getRows().size() > 0) {
+                        checkHasNext(dataList.getRows().size());
+                        mAdapter.setNewInstance(dataList.getRows());
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (dataList.getRows() != null && dataList.getRows().size() > 0) {
+                        mViewBinding.refreshLayout.finishLoadMore();
+                        checkHasNext(dataList.getRows().size());
+                        mAdapter.addData(dataList.getRows());
+                    } else {
+                        mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                    }
+                }
+            }
+        }
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+//        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
+    }
+
+    @Override
+    public void onGetLiveCourseError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mViewBinding.refreshLayout.finishLoadMore(false);
+            }
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.tv_filter) {
+            selectSubjectType();
+            return;
+        }
+        if (id == R.id.tv_search) {
+            searchCondition = mViewBinding.etTargetName.getText().toString().trim();
+            currentPage = 1;
+            getData(false);
+            return;
+        }
+    }
+
+    private void getData(boolean isShowLoading) {
+        if (currentPage == 1) {
+            mViewBinding.refreshLayout.resetNoMoreData();
+        }
+        presenter.queryLiveCourse(isShowLoading, currentSubjectId, searchCondition, currentPage);
+    }
+
+    private void selectSubjectType() {
+        if (subjectBeanList.size() == 0) {
+            return;
+        }
+        if (pvOptions == null) {
+            pvOptions = new OptionsPickerBuilder(getContext(), (options1, options2, options3, v) -> {
+                this.currentSelectSubjectPosition = options1;
+                QuerySubjectBean subjectBean = subjectBeanList.get(options1);
+                this.currentSubjectId = subjectBean.getId();
+                mViewBinding.tvFilter.setText(subjectBean.getPickerViewText());
+                currentPage = 1;
+                getData(false);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_select_options_layout, 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(v12 -> {
+                            pvOptions.returnData();
+                            pvOptions.dismiss();
+                        });
+                        ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
+
+                    }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT).isDialog(false).build();
+            pvOptions.setOnDismissListener(new OnDismissListener() {
+                @Override
+                public void onDismiss(Object o) {
+                    UiUtils.refreshFilterTextStyle(false, mViewBinding.tvFilter);
+                }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle(true, mViewBinding.tvFilter);
+                }
+            });
+        }
+        pvOptions.setPicker(subjectBeanList);
+        if (currentSelectSubjectPosition != -1 && currentSelectSubjectPosition < subjectBeanList.size()) {
+            pvOptions.setSelectOptions(currentSelectSubjectPosition);
+        }
+        pvOptions.show();
+    }
 }

+ 2 - 1
student/src/main/java/com/cooleshow/student/ui/course/VIPCustomCourseListFragment.java

@@ -97,7 +97,7 @@ public class VIPCustomCourseListFragment extends BaseMVPFragment<FgVipCustomCour
     private void initListener() {
         mViewBinding.tvFilter.setOnClickListener(this);
         mViewBinding.tvSearch.setOnClickListener(this);
-        mViewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(getContext()).setDrawableSize(20));
+        mViewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(getContext()));
         mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
             @Override
             public void onRefresh(@NonNull RefreshLayout refreshLayout) {
@@ -251,6 +251,7 @@ public class VIPCustomCourseListFragment extends BaseMVPFragment<FgVipCustomCour
 
     private void checkHasNext(int dataSize) {
         hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
     }
 
     @Override

+ 193 - 2
student/src/main/java/com/cooleshow/student/ui/course/VideoCourseAppointListFragment.java

@@ -1,25 +1,55 @@
 package com.cooleshow.student.ui.course;
 
+import android.graphics.Color;
+import android.text.TextUtils;
 import android.view.View;
+import android.widget.TextView;
 
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.listener.OnDismissListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.student.R;
+import com.cooleshow.student.adapter.LiveCourseAppointAdapter;
+import com.cooleshow.student.adapter.VideoCourseAppointAdapter;
 import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.bean.VideoCourseListBean;
 import com.cooleshow.student.contract.LiveCourseAppointListContract;
 import com.cooleshow.student.contract.VideoCourseAppointListContract;
 import com.cooleshow.student.databinding.FgLiveCourseAppointListLayoutBinding;
 import com.cooleshow.student.databinding.FgVideoCourseAppointListLayoutBinding;
 import com.cooleshow.student.presenter.course.LiveCourseAppointListPresenter;
 import com.cooleshow.student.presenter.course.VideoCourseAppointListPresenter;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
 /**
  * Author by pq, Date on 2024/11/13.
  * 视频课约课
  */
-public class VideoCourseAppointListFragment extends BaseMVPFragment<FgVideoCourseAppointListLayoutBinding, VideoCourseAppointListPresenter> implements VideoCourseAppointListContract.View {
+public class VideoCourseAppointListFragment extends BaseMVPFragment<FgVideoCourseAppointListLayoutBinding, VideoCourseAppointListPresenter> implements VideoCourseAppointListContract.View, View.OnClickListener {
     private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+    private OptionsPickerView pvOptions;
+    private int currentSelectSubjectPosition = -1;
+    private String currentSubjectId;
+    private int currentPage = 1;
+    private boolean hasNext = true;
+    private String searchCondition;
+    private VideoCourseAppointAdapter mAdapter;
+
+
     public static VideoCourseAppointListFragment newInstance() {
         VideoCourseAppointListFragment fragment = new VideoCourseAppointListFragment();
         return fragment;
@@ -37,7 +67,50 @@ public class VideoCourseAppointListFragment extends BaseMVPFragment<FgVideoCours
 
     @Override
     protected void initData() {
+        currentSubjectId = UserHelper.getSubjectId();
+        String subjectName = UserHelper.getSubjectName();
+        mViewBinding.tvFilter.setText(subjectName);
 
+        mAdapter = new VideoCourseAppointAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
+        mAdapter.setEmptyView(emptyViewLayout);
+        mViewBinding.recyclerViewList.setLayoutManager(new LinearLayoutManager(getContext()));
+        mViewBinding.recyclerViewList.setAdapter(mAdapter);
+        initListener();
+        getData(false);
+    }
+
+    private void getData(boolean isShowLoading) {
+        if (currentPage == 1) {
+            mViewBinding.refreshLayout.resetNoMoreData();
+        }
+        presenter.queryVideoCourse(isShowLoading,currentSubjectId,searchCondition,currentPage);
+    }
+
+    private void initListener() {
+        mViewBinding.tvFilter.setOnClickListener(this);
+        mViewBinding.tvSearch.setOnClickListener(this);
+        mViewBinding.refreshLayout.setRefreshFooter(new ClassicsFooter(getContext()));
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                getData(false);
+            }
+        });
+        mViewBinding.refreshLayout.setOnLoadMoreListener(new com.scwang.smart.refresh.layout.listener.OnLoadMoreListener() {
+            @Override
+            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    getData(false);
+                } else {
+                    mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                }
+            }
+        });
     }
 
     @Override
@@ -47,7 +120,125 @@ public class VideoCourseAppointListFragment extends BaseMVPFragment<FgVideoCours
 
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
         subjectBeanList.clear();
-        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
         subjectBeanList.addAll(data);
+        String subjectId = UserHelper.getSubjectId();
+        for (int i = 0; i < data.size(); i++) {
+            QuerySubjectBean querySubjectBean = data.get(i);
+            if (TextUtils.equals(subjectId, querySubjectBean.getId())) {
+                currentSelectSubjectPosition = i;
+            }
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.tv_filter) {
+            selectSubjectType();
+            return;
+        }
+        if (id == R.id.tv_search) {
+            searchCondition = mViewBinding.etTargetName.getText().toString().trim();
+            currentPage = 1;
+            getData(false);
+            return;
+        }
+    }
+
+    private void selectSubjectType() {
+        if (subjectBeanList.size() == 0) {
+            return;
+        }
+        if (pvOptions == null) {
+            pvOptions = new OptionsPickerBuilder(getContext(), (options1, options2, options3, v) -> {
+                this.currentSelectSubjectPosition = options1;
+                QuerySubjectBean subjectBean = subjectBeanList.get(options1);
+                this.currentSubjectId = subjectBean.getId();
+                mViewBinding.tvFilter.setText(subjectBean.getPickerViewText());
+                currentPage = 1;
+                getData(false);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_select_options_layout, 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(v12 -> {
+                            pvOptions.returnData();
+                            pvOptions.dismiss();
+                        });
+                        ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
+
+                    }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT).isDialog(false).build();
+            pvOptions.setOnDismissListener(new OnDismissListener() {
+                @Override
+                public void onDismiss(Object o) {
+                    UiUtils.refreshFilterTextStyle(false, mViewBinding.tvFilter);
+                }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle(true, mViewBinding.tvFilter);
+                }
+            });
+        }
+        pvOptions.setPicker(subjectBeanList);
+        if (currentSelectSubjectPosition != -1 && currentSelectSubjectPosition < subjectBeanList.size()) {
+            pvOptions.setSelectOptions(currentSelectSubjectPosition);
+        }
+        pvOptions.show();
+    }
+
+    @Override
+    public void onGetVideoCourseSuccess(int page, VideoCourseListBean dataList) {
+        if (isDetached()) {
+            return;
+        }
+        LOG.i("pq", "onGetVideoCourseSuccess:" + dataList);
+        if (dataList != null) {
+            if (page == 1) {
+                //第一页
+                mViewBinding.refreshLayout.finishRefresh();
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (dataList.getRows() != null && dataList.getRows().size() > 0) {
+                        checkHasNext(dataList.getRows().size());
+                        mAdapter.setNewInstance(dataList.getRows());
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (dataList.getRows() != null && dataList.getRows().size() > 0) {
+                        mViewBinding.refreshLayout.finishLoadMore();
+                        checkHasNext(dataList.getRows().size());
+                        mAdapter.addData(dataList.getRows());
+                    } else {
+                        mViewBinding.refreshLayout.finishLoadMoreWithNoMoreData();
+                    }
+                }
+            }
+        }
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
+    }
+
+    @Override
+    public void onGetCourseError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mViewBinding.refreshLayout.finishLoadMore(false);
+            }
+        }
     }
 }

+ 1 - 1
student/src/main/java/com/cooleshow/student/ui/main/MusicHallFragment.java

@@ -140,7 +140,7 @@ public class MusicHallFragment extends BaseMVPFragment<FgMusicHallLayoutBinding,
 
         if (id == R.id.view_search_bg) {
             //搜索
-            WebStartHelper.startSearch();
+//            WebStartHelper.startSearch();
             ARouter.getInstance().build(RouterPath.CourseCenter.APPOINTMENT_COURSE)
                     .navigation();
             return;

BIN
student/src/main/res/drawable-xhdpi/icon_live_course_time_tag.png


BIN
student/src/main/res/drawable-xxhdpi/icon_live_course_time_tag.png


+ 6 - 0
student/src/main/res/drawable/shape_ffe7e7_15dp_left.xml

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

+ 4 - 6
student/src/main/res/layout/activity_appointment_course.xml

@@ -3,7 +3,6 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/color_f6f8f9"
     android:orientation="vertical">
 
     <ImageView
@@ -42,13 +41,12 @@
 
 
     <androidx.viewpager2.widget.ViewPager2
-        app:layout_constraintBottom_toBottomOf="parent"
-        android:id="@+id/viewpager"
+        android:id="@+id/viewPager"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="1"
         android:overScrollMode="never"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
+        android:scrollbars="none"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/tablayout" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 4
student/src/main/res/layout/fg_interest_correction_course_list_layout.xml

@@ -89,21 +89,19 @@
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/view_search_bg"
-        android:layout_height="wrap_content"/>
+        android:layout_height="28dp"/>
 
 
     <com.scwang.smart.refresh.layout.SmartRefreshLayout
         android:id="@+id/refreshLayout"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_marginTop="12dp"
-        app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/sort_view"
         app:srlEnableLoadMore="true">
 
         <androidx.recyclerview.widget.RecyclerView
+            android:layout_marginTop="12dp"
             android:id="@+id/recyclerView_list"
             android:layout_marginEnd="14dp"
             android:layout_marginStart="14dp"

+ 11 - 51
student/src/main/res/layout/fg_live_course_appoint_list_layout.xml

@@ -2,6 +2,7 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
+    android:paddingTop="12dp"
     android:layout_height="match_parent">
 
     <TextView
@@ -55,7 +56,8 @@
         android:includeFontPadding="false"
         android:maxLines="1"
         android:paddingStart="8dp"
-        android:textColor="@color/color_999999"
+        android:textColorHint="@color/color_66000000"
+        android:textColor="@color/color_333333"
         android:textCursorDrawable="@drawable/shape_2dc7aa_1dp"
         android:textSize="@dimen/sp_14"
         android:theme="@style/MyEditText"
@@ -79,68 +81,26 @@
         app:layout_constraintRight_toRightOf="@+id/view_search_bg"
         app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
 
-    <RadioGroup
-        android:id="@+id/rg_filter"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:orientation="horizontal"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/view_search_bg">
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="仅看未来30天有空" />
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="已上课时" />
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="课时单价" />
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="评分" />
-    </RadioGroup>
 
     <com.scwang.smart.refresh.layout.SmartRefreshLayout
         android:id="@+id/refreshLayout"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:layout_marginTop="12dp"
+        app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/rg_filter"
-        app:srlEnableLoadMore="false">
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg"
+        app:srlEnableLoadMore="true">
 
         <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/recyclerView"
+            android:id="@+id/recyclerView_list"
+            android:layout_marginEnd="14dp"
+            android:layout_marginStart="14dp"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:overScrollMode="never"
-            android:scrollbars="none"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/liv_letters"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/view_search_bg"
-            app:layout_constraintVertical_bias="0.0" />
+            android:scrollbars="none" />
     </com.scwang.smart.refresh.layout.SmartRefreshLayout>
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 11 - 51
student/src/main/res/layout/fg_video_course_appoint_list_layout.xml

@@ -2,6 +2,7 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
+    android:paddingTop="12dp"
     android:layout_height="match_parent">
 
     <TextView
@@ -55,7 +56,8 @@
         android:includeFontPadding="false"
         android:maxLines="1"
         android:paddingStart="8dp"
-        android:textColor="@color/color_999999"
+        android:textColorHint="@color/color_66000000"
+        android:textColor="@color/color_333333"
         android:textCursorDrawable="@drawable/shape_2dc7aa_1dp"
         android:textSize="@dimen/sp_14"
         android:theme="@style/MyEditText"
@@ -79,68 +81,26 @@
         app:layout_constraintRight_toRightOf="@+id/view_search_bg"
         app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
 
-    <RadioGroup
-        android:id="@+id/rg_filter"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:orientation="horizontal"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/view_search_bg">
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="仅看未来30天有空" />
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="已上课时" />
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="课时单价" />
-
-        <RadioButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:button="@null"
-            android:paddingStart="5dp"
-            android:paddingEnd="5dp"
-            android:text="评分" />
-    </RadioGroup>
 
     <com.scwang.smart.refresh.layout.SmartRefreshLayout
         android:id="@+id/refreshLayout"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:layout_marginTop="12dp"
+        app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/rg_filter"
-        app:srlEnableLoadMore="false">
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg"
+        app:srlEnableLoadMore="true">
 
         <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/recyclerView"
+            android:id="@+id/recyclerView_list"
+            android:layout_marginEnd="14dp"
+            android:layout_marginStart="14dp"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:overScrollMode="never"
-            android:scrollbars="none"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toStartOf="@id/liv_letters"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/view_search_bg"
-            app:layout_constraintVertical_bias="0.0" />
+            android:scrollbars="none" />
     </com.scwang.smart.refresh.layout.SmartRefreshLayout>
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
student/src/main/res/layout/fg_vip_custom_course_list_layout.xml

@@ -89,7 +89,7 @@
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/view_search_bg"
-        android:layout_height="wrap_content"/>
+        android:layout_height="28dp"/>
 
 
     <com.scwang.smart.refresh.layout.SmartRefreshLayout

+ 163 - 0
student/src/main/res/layout/item_live_course_appoint_layout.xml

@@ -0,0 +1,163 @@
+<?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_marginBottom="12dp"
+    android:background="@drawable/bg_white_6dp"
+    android:paddingStart="12dp"
+    android:paddingEnd="12dp"
+    android:paddingBottom="14dp">
+
+    <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="9dp"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        android:textStyle="bold"
+        android:drawablePadding="6dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="开课时间:2024-11-16 09:30" />
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:id="@+id/iv_bg"
+        android:layout_width="0dp"
+        app:layout_constraintDimensionRatio="h,16:9"
+        app:layout_constraintRight_toRightOf="parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="11dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_time"
+        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: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: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:layout_marginTop="11dp"
+        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_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_des"
+        tools:text="6人已购买" />
+
+
+    <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/tv_buy_num"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_buy_num"
+        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: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>

+ 152 - 0
student/src/main/res/layout/item_video_course_appoint_layout.xml

@@ -0,0 +1,152 @@
+<?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_marginBottom="12dp"
+    android:background="@drawable/bg_white_6dp"
+    android:paddingBottom="9dp">
+
+
+    <com.cooleshow.base.widgets.QMUIRadiusImageView
+        android:id="@+id/im_pic"
+        android:layout_width="146dp"
+        android:layout_height="@dimen/dp_81"
+        android:layout_marginStart="12dp"
+        android:layout_marginTop="12dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:qmui_corner_radius="6dp" />
+
+    <TextView
+        android:id="@+id/course_name"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_13"
+        android:layout_marginStart="4dp"
+        android:layout_marginTop="4dp"
+        android:background="@drawable/shape_66000000_3dp"
+        android:gravity="center"
+        android:paddingLeft="@dimen/dp_4"
+        android:paddingRight="@dimen/dp_4"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_9"
+        app:layout_constraintLeft_toLeftOf="@+id/im_pic"
+        app:layout_constraintTop_toTopOf="@+id/im_pic" />
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="12dp"
+        android:layout_marginEnd="5dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_1a1a1a"
+        android:textSize="@dimen/sp_15"
+        app:layout_constraintBottom_toTopOf="@+id/ll_tag"
+        app:layout_constraintLeft_toRightOf="@+id/im_pic"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/im_pic"
+        app:layout_constraintVertical_chainStyle="packed"
+        tools:text="从零开始学竖笛视频课从零开始学竖笛视频课从零开始学竖笛视频课" />
+
+    <LinearLayout
+        android:id="@+id/ll_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:orientation="horizontal"
+        app:layout_constraintBottom_toTopOf="@+id/tv_buy_num"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_title"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title">
+
+        <TextView
+            android:id="@+id/tv_music_num"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/shape_f5f6fa_3dp"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:paddingStart="6dp"
+            android:paddingTop="1dp"
+            android:paddingEnd="6dp"
+            android:paddingBottom="1dp"
+            android:textColor="@color/color_777777"
+            android:textSize="@dimen/sp_11"
+            android:visibility="gone"
+            tools:text="3首曲目" />
+
+        <TextView
+            android:id="@+id/tv_price_unit"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="4dp"
+            android:background="@drawable/shape_f5f6fa_3dp"
+            android:gravity="center"
+            android:includeFontPadding="false"
+            android:paddingStart="6dp"
+            android:paddingTop="1dp"
+            android:paddingEnd="6dp"
+            android:paddingBottom="1dp"
+            android:textColor="@color/color_777777"
+            android:textSize="@dimen/sp_11"
+            app:layout_constraintBaseline_toBaselineOf="@+id/tv_music_num"
+            app:layout_constraintLeft_toRightOf="@+id/tv_music_num"
+            tools:text="4课时" />
+    </LinearLayout>
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/iv_avatar"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_teacher_name"
+        app:layout_constraintLeft_toLeftOf="@+id/ll_tag"
+        app:layout_constraintRight_toLeftOf="@+id/tv_teacher_name"
+        app:layout_constraintTop_toTopOf="@+id/tv_teacher_name" />
+
+    <TextView
+        app:layout_constraintRight_toLeftOf="@+id/tv_price_symbol"
+        android:id="@+id/tv_teacher_name"
+        android:layout_width="0dp"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:layout_marginEnd="5dp"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="12dp"
+        android:includeFontPadding="false"
+        android:paddingStart="4dp"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_13"
+        android:visibility="visible"
+        app:layout_constraintBottom_toBottomOf="@+id/im_pic"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintTop_toBottomOf="@+id/ll_tag"
+        tools:text="严老师" />
+
+    <TextView
+        android:id="@+id/tv_price"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="12dp"
+        android:text="120"
+        android:textColor="@color/color_f44541"
+        android:textSize="@dimen/sp_18"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_teacher_name"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_teacher_name" />
+
+    <TextView
+        android:id="@+id/tv_price_symbol"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="¥"
+        android:textColor="@color/color_f44541"
+        android:textSize="@dimen/sp_14"
+        android:textStyle="bold"
+        app:layout_constraintBaseline_toBaselineOf="@+id/tv_price"
+        app:layout_constraintRight_toLeftOf="@+id/tv_price" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
teacher/src/main/java/com/cooleshow/teacher/adapter/MineVideoCourseAdapter.java

@@ -47,7 +47,7 @@ public class MineVideoCourseAdapter extends BaseQuickAdapter<VideoCourseListBean
         helper.setText(R.id.course_name, item.lessonSubjectName);
         //封面
         ImageView im_pic = helper.getView(R.id.im_pic);
-        GlideUtils.INSTANCE.loadTopRoundImage(getContext(), item.lessonCoverUrl, im_pic, 10, com.cooleshow.base.R.drawable.bg_video_placeholder);
+        GlideUtils.INSTANCE.loadImage(getContext(), item.lessonCoverUrl, im_pic, com.cooleshow.base.R.drawable.bg_video_placeholder);
         //课程名称
         TextView tv_title = helper.getView(R.id.tv_title);
         tv_title.setText(item.lessonName);

+ 1 - 1
teacher/src/main/java/com/cooleshow/teacher/presenter/homePage/LiveCoursePagePresenter.java

@@ -21,7 +21,7 @@ public class LiveCoursePagePresenter extends BasePresenter<LiveCoursePageContrac
         LiveCourseEntry entry = new LiveCourseEntry();
         entry.rows = Constants.DEFAULT_DATA_SIZE;
         entry.page = page;
-        entry.groupStatus = "apply";
+        entry.groupStatus = "APPLY";
         addSubscribe(create(APIService.class).queryPageCourseGroup(entry), new BaseObserver<MineLiveCourseListBean>(getView()) {
             @Override
             protected void onSuccess(MineLiveCourseListBean data) {