Jelajahi Sumber

增加老师端个人主页小组课tab

Pq 6 bulan lalu
induk
melakukan
b334deaeb4

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java

@@ -124,6 +124,7 @@ public abstract class WebConstants {
     public static final String TEACHER_VIDEO_MODIFY = getBaseUrlH5() + "/#/videoCreate?groupId=4";
     //创建直播课
     public static final String TEACHER_LIVE_CREATE = getBaseUrlH5() + "/#/liveCreate";
+    public static final String TEACHER_GROUP_CREATE = getBaseUrlH5() + "/#/groupCreate";
     //编辑直播课
     public static final String TEACHER_LIVE_EDIT = getBaseUrlH5() + "/#/liveCreate?groupId=%s";
     //直播课详情

+ 2 - 1
BaseLibrary/src/main/java/com/cooleshow/base/constanst/CourseType.java

@@ -11,7 +11,8 @@ public enum CourseType implements IPickerViewData, IFilterViewData {
     VIP("VIP", "VIP定制课"),
     PRACTICE("PRACTICE", "趣纠课"),
     LIVE("LIVE", "直播课"),
-    PIANO_ROOM_CLASS("PIANO_ROOM_CLASS", "琴房课");
+    PIANO_ROOM_CLASS("PIANO_ROOM_CLASS", "琴房课"),
+    GROUP("GROUP", "小组课");
 
 
     private final String value;

+ 7 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebStartHelper.java

@@ -314,4 +314,11 @@ public class WebStartHelper {
     public static String getWorksMusicScoreUrl(String musicId, String musicRenderType, String partIndex,boolean isVideo) {
         return String.format(WebConstants.WORKS_MUSIC_SCORE, musicId, musicRenderType,partIndex);
     }
+
+    public static void goCreateGroupCourse() {
+        ARouter.getInstance()
+                .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, WebConstants.TEACHER_GROUP_CREATE)
+                .navigation();
+    }
 }

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

@@ -34,6 +34,7 @@
     <string name="vip_course_tip_str">VIP定制课采用一对一专属授课模式,每节课时长为45分钟。课程内容根据学生的具体需求量身打造,旨在全面提升学生的个人技能与表现。不论是希望在乐器演奏技巧上取得突破,如提高指法精准度、气息控制能力或节奏掌握等;还是为即将到来的重要活动、比赛或考级做充分准备,我们都能提供高度匹配的教学方案。此外,教学进度将根据每位学员的学习吸收情况灵活调整,确保每个人都能在最适合自己的节奏中稳步前进,扎实提升个人能力。</string>
     <string name="interest_course_tip_str">趣纠课以一对一专属、高度针对性的形式进行,每次课程时长为25分钟。本课程专为解决学生日常练习中的疑问与误区设计,尤其适合那些在自我练习后感到困惑或不确定自己方法是否正确的学生。不同于传统的教学模式,趣纠课不侧重于新知识或新技能的传授,而是全心全意致力于检查学生现有的练习成果,并及时纠正其中出现的问题。这种方式不仅有助于学生巩固已掌握的知识和技能,还能有效防止错误习惯的形成和发展,为他们今后的学习打下更加坚实的基础。</string>
     <string name="live_course_tip_str">直播课是现代教育领域中一种广受欢迎的课程形式,它集实时互动、多媒体展示和高度便利性于一体,为学习者带来了独特且丰富的学习体验。特别是在管乐直播课中,教师可以通过播放经典音乐作品,加深学生对音乐之美的感知与理解。对于那些需要具体操作演示的教学内容,直播课能够提供清晰直观的视角,让教师的每一个动作细节都展现在学生面前,确保学习效果。直播课程的内容围绕特定主题精心设计,旨在满足不同学习者的需求,促进知识与技能的有效传递。</string>
+    <string name="group_course_tip_str">小组课是老师根据教学目的编排的课程,固定时间进行1V5线上授课。您可根据老师开放的课程内容和您的时间安排,选择您感兴趣的课程组进行学习。</string>
     <string name="video_course_tip_str">视频课是由教师事先精心准备并录制的课程内容。教师依据教学大纲和目标,系统规划每一节视频的主题与内容,确保教学的连贯性和完整性。在录制过程中,采用专业设备如高清摄像机和录屏软件,保障视频画质清晰、音频质量优良。视频课为学生提供了极大的学习灵活性,他们可以依据个人的时间安排自由选择学习时间,不受地点限制。特别适用于系统化学习体系的内容,视频课能够帮助学生按部就班地掌握知识,实现自主高效学习。</string>
     <string name="piano_course_tip_str">琴房课是针对教师私有学生的线上课程,您可以通过我的-云酷琴房邀请自己的学生与自己绑定,并为已绑定学生安排线上课程。琴房课无需学生付费,教师需充值琴房时长后排课,排课时根据课程时长与上课人数扣减已购买时长。</string>
     <string name="piano_course_tip_str_student">琴房课是专为教师和他们的私有学生设计的1对多线上课程。通过教师分享的云酷琴房链接,学生可以与教师绑定,从而进入专属的线上琴房。在琴房中,教师可以为学生安排和管理线上课程,提供个性化的教学体验。</string>

+ 69 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/GroupCourseListAdapter.java

@@ -0,0 +1,69 @@
+package com.cooleshow.teacher.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.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+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.teacher.R;
+import com.cooleshow.teacher.bean.MineLiveCourseListBean;
+
+import androidx.annotation.NonNull;
+
+/**
+ * 创建日期:2022/6/17 15:45
+ *
+ * @author Ryan
+ * 类说明:个人主页-小组课
+ */
+public class GroupCourseListAdapter extends BaseQuickAdapter<MineLiveCourseListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public GroupCourseListAdapter() {
+        super(R.layout.item_home_page_group_course_list_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, MineLiveCourseListBean.RowsBean data) {
+        if (data == null) {
+            return;
+        }
+        String timeStr = TextUtils.isEmpty(data.courseStartTime) ? "" : TimeUtils.date2String(TimeUtils.string2Date(data.courseStartTime), "yyyy-MM-dd HH:mm");
+        //时间
+        holder.setText(R.id.tv_time, "开课时间:" + timeStr);
+        //title
+        holder.setText(R.id.tv_title, data.courseGroupName);
+        //介绍
+        String courseIntroduce = data.courseIntroduce;
+        if (TextUtils.isEmpty(courseIntroduce)) {
+            courseIntroduce = "暂无介绍";
+        }
+        courseIntroduce = StringUtils.replaceSpace(courseIntroduce);
+        holder.setText(R.id.tv_des, courseIntroduce);
+        //subjectName
+        holder.setText(R.id.tv_course_name, data.subjectName);
+        //购买人数
+        String tip = "剩余" + (data.getMaxStudentNum() - data.getStudentCount()) + "个名额";
+        holder.setText(R.id.tv_buy_num, tip);
+        //课程封面
+        ImageView iv_bg = holder.getView(R.id.iv_bg);
+        GlideUtils.INSTANCE.loadImage(getContext(), data.backgroundPic, 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.coursePrice, data.courseNum));
+        tv_price_unit.setText(String.format("/%d课时", data.courseNum));
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+}

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

@@ -59,7 +59,7 @@ public class MineLiveCourseAdapter extends BaseQuickAdapter<MineLiveCourseListBe
 
         //学生购买人数
         TextView tv_student_count = helper.getView(R.id.tv_buy_num);
-        tv_student_count.setText(UiUtils.getBuyNumTip(item.coursePrice, item.studentCount));
+        tv_student_count.setText(UiUtils.getBuyNumTip(item.coursePrice, String.valueOf(item.studentCount)));
         if (TextUtils.equals(type, MineLiveCourseActivity.TYPE_NOT_SALE)) {
             tv_student_count.setVisibility(View.INVISIBLE);
         } else {

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

@@ -51,7 +51,7 @@ public class MineLiveCourseListAdapter extends BaseQuickAdapter<MineLiveCourseLi
         //subjectName
         holder.setText(R.id.tv_course_name, data.subjectName);
         //购买人数
-        holder.setText(R.id.tv_buy_num, UiUtils.getBuyNumTip2(data.coursePrice, data.studentCount));
+        holder.setText(R.id.tv_buy_num, UiUtils.getBuyNumTip2(data.coursePrice, String.valueOf(data.studentCount)));
         //课程封面
         ImageView iv_bg = holder.getView(R.id.iv_bg);
         GlideUtils.INSTANCE.loadImage(getContext(), data.backgroundPic, iv_bg, com.cooleshow.base.R.drawable.bg_video_placeholder);

+ 169 - 1
teacher/src/main/java/com/cooleshow/teacher/bean/MineLiveCourseListBean.java

@@ -57,11 +57,179 @@ public class MineLiveCourseListBean {
         public String salesStartDate;
         public int singleCourseMinutes;
         public String status;
-        public String studentCount;
+        public int studentCount;
         public String subjectName;
         public int teacherId;
         public String teacherName;
         public String userName;
+        public int maxStudentNum;
 
+        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 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 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 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 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;
+        }
+
+        public int getMaxStudentNum() {
+            return maxStudentNum;
+        }
+
+        public void setMaxStudentNum(int maxStudentNum) {
+            this.maxStudentNum = maxStudentNum;
+        }
     }
 }

+ 1 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/request/LiveCourseEntry.java

@@ -10,4 +10,5 @@ public class LiveCourseEntry {
     public int page;
     public int rows;
     public String groupStatus;
+    public String courseType;
 }

+ 57 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/homePage/GroupCoursePagePresenter.java

@@ -0,0 +1,57 @@
+package com.cooleshow.teacher.presenter.homePage;
+
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.constanst.CourseType;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.teacher.api.APIService;
+import com.cooleshow.teacher.bean.MineLiveCourseListBean;
+import com.cooleshow.teacher.bean.request.LiveCourseEntry;
+import com.cooleshow.teacher.constants.CourseConstants;
+import com.cooleshow.teacher.contract.LiveCoursePageContract;
+import com.cooleshow.usercenter.bean.TeacherUserInfo;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public class GroupCoursePagePresenter extends BasePresenter<LiveCoursePageContract.LiveCoursePageView> implements LiveCoursePageContract.Presenter {
+
+    public void queryGroupCourse(int page) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        LiveCourseEntry entry = new LiveCourseEntry();
+        entry.rows = Constants.DEFAULT_DATA_SIZE;
+        entry.page = page;
+        entry.groupStatus = "APPLY";
+        entry.courseType = CourseType.GROUP.getId();
+        addSubscribe(create(APIService.class).queryPageCourseGroup(entry), new BaseObserver<MineLiveCourseListBean>(getView()) {
+            @Override
+            protected void onSuccess(MineLiveCourseListBean data) {
+                if (getView() != null) {
+                    getView().onGetLiveCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+
+
+    public void getTeacherUserInfo() {
+        addSubscribe(create(APIService.class).getTeacherUserInfo(), new BaseObserver<TeacherUserInfo>(getView()) {
+            @Override
+            protected void onSuccess(TeacherUserInfo data) {
+                if (getView() != null) {
+                    getView().getTeacherInfoSuccess(data);
+                }
+            }
+        });
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.presenter.homePage;
 
 import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.constanst.CourseType;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
 import com.cooleshow.teacher.api.APIService;
@@ -22,6 +23,7 @@ public class LiveCoursePagePresenter extends BasePresenter<LiveCoursePageContrac
         entry.rows = Constants.DEFAULT_DATA_SIZE;
         entry.page = page;
         entry.groupStatus = "APPLY";
+        entry.courseType = CourseType.LIVE.getId();
         addSubscribe(create(APIService.class).queryPageCourseGroup(entry), new BaseObserver<MineLiveCourseListBean>(getView()) {
             @Override
             protected void onSuccess(MineLiveCourseListBean data) {

+ 268 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/GroupCoursePageFragment.java

@@ -0,0 +1,268 @@
+package com.cooleshow.teacher.ui.homepage;
+
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.utils.TimeUtils;
+import com.cooleshow.base.utils.helper.QMUIDeviceHelper;
+import com.cooleshow.base.utils.helper.WebStartHelper;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.GridItemDecoration;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.adapter.GroupCourseListAdapter;
+import com.cooleshow.teacher.adapter.MineLiveCourseListAdapter;
+import com.cooleshow.teacher.bean.MineLiveCourseListBean;
+import com.cooleshow.teacher.constants.TeacherInfoConstants;
+import com.cooleshow.teacher.contract.LiveCoursePageContract;
+import com.cooleshow.teacher.databinding.FragmentLiveCoursePageLayoutBinding;
+import com.cooleshow.teacher.presenter.homePage.GroupCoursePagePresenter;
+import com.cooleshow.teacher.presenter.homePage.LiveCoursePagePresenter;
+import com.cooleshow.teacher.widgets.HomePageCourseCommonHeaderView;
+import com.cooleshow.usercenter.bean.TeacherUserInfo;
+
+import java.util.Date;
+
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2022/5/9.
+ * 我的主页-小组课
+ */
+public class GroupCoursePageFragment extends BaseMVPFragment<FragmentLiveCoursePageLayoutBinding, GroupCoursePagePresenter> implements LiveCoursePageContract.LiveCoursePageView, View.OnClickListener {
+    public static final String TIP_CACHE_KEY = "group_course_tip_key";
+    private int currentPage;
+    private GroupCourseListAdapter mAdapter;
+    private EmptyViewLayout mEmptyView;
+    private boolean hasNext = true;
+//    private String currentFilterDate;
+
+    //是否认证 0 否 1 是
+    private int certFlag;
+
+    @Override
+    protected void initView(View rootView) {
+    }
+
+    @Override
+    protected void initData() {
+
+        mViewBinding.commonHeader.setDataStyle(TIP_CACHE_KEY, R.drawable.icon_vip_custom_course_des_tag, getString(R.string.group_course_des_title), getString(com.cooleshow.base.R.string.group_course_tip_str), R.drawable.icon_group_course_set, getString(R.string.create_group_course_text), new HomePageCourseCommonHeaderView.OnEventListener() {
+            @Override
+            public void onCloseTip() {
+                updateEmptyViewLayoutParams();
+            }
+
+            @Override
+            public void goCreate() {
+                GroupCoursePageFragment.this.goCreate();
+            }
+        });
+        mViewBinding.commonHeader.handleCreateBt(false);
+
+
+        Date currentSelectDate = TimeUtils.getNowDate();
+        String targetDateTimeStr = TimeUtils.date2String(currentSelectDate, TimeUtils.getSafeDateFormat("yyyy-MM"));
+//        currentFilterDate = targetDateTimeStr;
+        mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> {
+            currentPage = 1;
+            queryCourse();
+        });
+
+        mAdapter = new GroupCourseListAdapter();
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(() -> {
+            //上拉加载
+            if (hasNext) {
+                currentPage++;
+                queryCourse();
+            } else {
+                mAdapter.getLoadMoreModule().loadMoreEnd();
+            }
+        });
+        RecyclerView.LayoutManager layoutManager;
+        if (QMUIDeviceHelper.isTablet(getContext())) {
+            layoutManager = new GridLayoutManager(getContext(), 2);
+            GridItemDecoration itemDecoration = new GridItemDecoration(2, 0, 0, SizeUtils.dp2px(6));
+            mViewBinding.recyclerView.addItemDecoration(itemDecoration);
+        } else {
+            layoutManager = new LinearLayoutManager(getContext());
+        }
+        setEmptyView();
+        mViewBinding.recyclerView.setLayoutManager(layoutManager);
+        mViewBinding.recyclerView.setAdapter(mAdapter);
+        mAdapter.setOnItemClickListener((adapter, view, position) -> {
+            MineLiveCourseListBean.RowsBean item = mAdapter.getData().get(position);
+        });
+
+    }
+
+    @Override
+    protected FragmentLiveCoursePageLayoutBinding getLayoutView() {
+        return FragmentLiveCoursePageLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected GroupCoursePagePresenter createPresenter() {
+        return new GroupCoursePagePresenter();
+    }
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.tv_open:
+                if (certFlag == 0) {
+                    ARouter.getInstance().build(RouterPath.WebCenter.ACTIVITY_HTML)
+                            .withString(WebConstants.WEB_URL, WebConstants.TEACHER_CERT)
+                            .navigation();
+                }
+                break;
+        }
+
+    }
+
+    private void goCreate() {
+        WebStartHelper.goCreateGroupCourse();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        currentPage = 1;
+        queryCourse();
+    }
+
+    private void queryCourse() {
+        //根据默认筛选条件查询
+        presenter.queryGroupCourse(currentPage);
+    }
+
+    @Override
+    public void onGetLiveCourseSuccess(int page, MineLiveCourseListBean liveCourseListBean) {
+        if (isDetached()) {
+            return;
+        }
+        if (liveCourseListBean != null) {
+            if (page == 1) {
+                //第一页
+                mViewBinding.refreshLayout.finishRefresh();
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (liveCourseListBean.rows != null && liveCourseListBean.rows.size() > 0) {
+                        checkHasNext(liveCourseListBean.rows.size());
+                        mAdapter.setNewInstance(liveCourseListBean.rows);
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (liveCourseListBean.rows != null && liveCourseListBean.rows.size() > 0) {
+                        mAdapter.getLoadMoreModule().loadMoreComplete();
+                        checkHasNext(liveCourseListBean.rows.size());
+                        mAdapter.addData(liveCourseListBean.rows);
+                    } else {
+                        mAdapter.getLoadMoreModule().loadMoreEnd();
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onGetCourseError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+    private void setEmptyView() {
+        if (mEmptyView == null) {
+            mEmptyView = new EmptyViewLayout(getContext());
+        }
+        boolean isVis = mViewBinding.commonHeader.contentIsVisibility();
+        if (isVis) {
+            //如果顶部内容显示,需要自适应WRAP_CONTENT高度,不然页面折叠状态下可能因为Recyclerview高度比较小,导致无法展示完缺省图
+            ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+            mEmptyView.setLayoutParams(layoutParams);
+        }
+        mEmptyView.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无内容");
+        mAdapter.setEmptyView(mEmptyView);
+    }
+
+    private void showNotHasLivePermissionView(String text, boolean isShowOpenBt, String btText) {
+        View noPermissionTipView = LayoutInflater.from(getContext()).inflate(R.layout.view_no_option_permission_tip_layout, mAdapter.getEmptyLayout(), false);
+        noPermissionTipView.findViewById(R.id.tv_open).setOnClickListener(this);
+        TextView tv_empty_hint = noPermissionTipView.findViewById(R.id.tv_empty_hint);
+        TextView tv_open = noPermissionTipView.findViewById(R.id.tv_open);
+        tv_empty_hint.setText(text);
+        tv_open.setVisibility(isShowOpenBt ? View.VISIBLE : View.GONE);
+        tv_open.setText(btText);
+        boolean isVis = mViewBinding.commonHeader.contentIsVisibility();
+        if (isVis) {
+            //如果顶部内容显示,需要自适应WRAP_CONTENT高度,不然页面折叠状态下可能因为Recyclerview高度比较小,导致无法展示完缺省图
+            ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+            noPermissionTipView.setLayoutParams(layoutParams);
+        }
+        mAdapter.setEmptyView(noPermissionTipView);
+    }
+
+    @Override
+    public void getTeacherInfoSuccess(TeacherUserInfo teacherUserInfo) {
+        if (TextUtils.equals(teacherUserInfo.entryStatus, TeacherInfoConstants.ENTRY_STATUS_DOING)) {
+            //入驻审核中
+            certFlag = 0;
+            mViewBinding.commonHeader.handleCreateBt(false);
+            showNotHasLivePermissionView("老师认证审核中!", false, "");
+        } else if (TextUtils.equals(teacherUserInfo.entryStatus, TeacherInfoConstants.ENTRY_STATUS_PASS)) {
+            //入驻审核通过
+            certFlag = 1;
+            mViewBinding.commonHeader.handleCreateBt(true);
+            setEmptyView();
+            currentPage = 1;
+            queryCourse();
+        } else {
+            //未通过或者未申请
+            certFlag = 0;
+            mViewBinding.commonHeader.handleCreateBt(false);
+            showNotHasLivePermissionView("您还没有完成老师认证\n认证后才可创建直播课哦~", true, "去认证");
+        }
+    }
+
+    private void updateEmptyViewLayoutParams() {
+        if (mAdapter != null) {
+            //为了实现居中显示空视图,所以重新设置一下缺省图
+            FrameLayout emptyLayout = mAdapter.getEmptyLayout();
+            if (emptyLayout != null) {
+                View childAt = emptyLayout.getChildAt(0);
+                ViewGroup.LayoutParams layoutParams = childAt.getLayoutParams();
+                layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+                layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+                childAt.setLayoutParams(layoutParams);
+                mAdapter.setEmptyView(childAt);
+            }
+        }
+    }
+}

+ 3 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/HomePageActivity.java

@@ -58,7 +58,7 @@ import androidx.fragment.app.Fragment;
  */
 @Route(path = RouterPath.MineCenter.HOME_PAGE)
 public class HomePageActivity extends BaseMVPActivity<ActivityHomePageNewLayoutBinding, HomePagePresenter> implements HomePageContract.HomePageView, View.OnClickListener {
-    public static final String[] titles = new String[]{"VIP定制课", "趣纠课", "直播课", "视频课", "乐谱"};
+    public static final String[] titles = new String[]{"VIP定制课", "趣纠课", "小组课","直播课", "视频课", "乐谱"};
     public static final int EXPAND_MODE = 1;
     public static final int COLLAP_MODE = 2;
 
@@ -145,8 +145,10 @@ public class HomePageActivity extends BaseMVPActivity<ActivityHomePageNewLayoutB
         LiveCoursePageFragment liveCoursePageFragment = new LiveCoursePageFragment();
         VideoCoursePageFragment videoCoursePageFragment = new VideoCoursePageFragment();
         mMusicPageFragment = new SheetMusicPageFragment();
+        GroupCoursePageFragment groupCoursePageFragment =new GroupCoursePageFragment();
         fragments.add(vipCustomCoursePageFragment);
         fragments.add(interestCorrectCoursePageFragment);
+        fragments.add(groupCoursePageFragment);
         fragments.add(liveCoursePageFragment);
         fragments.add(videoCoursePageFragment);
         fragments.add(mMusicPageFragment);

TEMPAT SAMPAH
teacher/src/main/res/drawable-xhdpi/icon_group_course_set.png


TEMPAT SAMPAH
teacher/src/main/res/drawable-xxhdpi/icon_group_course_set.png


+ 162 - 0
teacher/src/main/res/layout/item_home_page_group_course_list_layout.xml

@@ -0,0 +1,162 @@
+<?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_10dp"
+    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="12dp"
+        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="12dp"
+        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: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>

+ 2 - 0
teacher/src/main/res/values/strings.xml

@@ -58,8 +58,10 @@
     <string name="interest_course_des_title">什么是趣纠课?</string>
     <string name="set_interest_course_text">设置趣纠课</string>
     <string name="create_live_course_text">创建直播课</string>
+    <string name="create_group_course_text">创建小组课</string>
     <string name="live_course_des_title">什么是直播课?</string>
     <string name="video_course_des_title">什么是视频课?</string>
+    <string name="group_course_des_title">什么是小组课?</string>
     <string name="create_video_course_text">创建视频课</string>
     <string name="upload_music_sheet_str">上传乐谱</string>
     <string name="vip_setting_str1">扣除应缴税金和平台服务费后\n您的课程预计收入为:单课时</string>