瀏覽代碼

增加学生端约课列表小组课tab页

Pq 8 月之前
父節點
當前提交
8bb9205b32
共有 16 個文件被更改,包括 773 次插入8 次删除
  1. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/WebConstants.java
  2. 8 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebStartHelper.java
  3. 67 0
      student/src/main/java/com/cooleshow/student/adapter/GroupCourseAppointAdapter.java
  4. 6 1
      student/src/main/java/com/cooleshow/student/adapter/LiveCourseAppointAdapter.java
  5. 12 3
      student/src/main/java/com/cooleshow/student/bean/LiveCourseAppointListBean.java
  6. 1 0
      student/src/main/java/com/cooleshow/student/bean/request/LiveCourseEntry.java
  7. 1 0
      student/src/main/java/com/cooleshow/student/constants/HomeMenuConstants.java
  8. 21 0
      student/src/main/java/com/cooleshow/student/contract/GroupCourseAppointListContract.java
  9. 48 0
      student/src/main/java/com/cooleshow/student/presenter/course/GroupCourseAppointListPresenter.java
  10. 2 0
      student/src/main/java/com/cooleshow/student/presenter/course/LiveCourseAppointListPresenter.java
  11. 7 1
      student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java
  12. 279 0
      student/src/main/java/com/cooleshow/student/ui/course/GroupCourseAppointListFragment.java
  13. 6 2
      student/src/main/java/com/cooleshow/student/ui/main/HomeMenuFragment.java
  14. 106 0
      student/src/main/res/layout/fg_group_course_appoint_list_layout.xml
  15. 207 0
      student/src/main/res/layout/item_group_course_appoint_layout.xml
  16. 1 1
      teacher/src/main/java/com/cooleshow/teacher/adapter/GroupCourseListAdapter.java

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

@@ -195,6 +195,7 @@ public abstract class WebConstants {
     public static final String APPOINTMENT_LIVE_COURSE = getBaseUrlH5() + "/#/liveDetail?groupId=%s";//约课直播课
     public static final String APPOINTMENT_VIDEO_COURSE = getBaseUrlH5() + "/#/videoDetail?groupId=%s";//约课视频课
     public static final String TEACHER_VIP_COURSE_SETTING = getBaseUrlH5() + "/#/practiceSetting?tabs=vip";//老师端VIP课设置
+    public static final String APPOINTMENT_GROUP_COURSE = getBaseUrlH5() + "/#/groupDetail?groupId=%s";//约课小组课
 
     public static final String TEACHER_APPOINTMENT_COURSE_SETTING = getBaseUrlH5() + "/#/practiceSettingTimer";//老师端约课时间段配置
     public static final String STUDENT_FREE_CARD = getBaseUrlH5() + "/#/discount-card";//畅学卡

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

@@ -296,6 +296,14 @@ public class WebStartHelper {
 
     }
 
+    public static void startAppointmentGroupCourse(String groupId) {
+        ARouter.getInstance()
+                .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, String.format(WebConstants.APPOINTMENT_GROUP_COURSE, groupId))
+                .navigation();
+
+    }
+
     public static void startAppointmentTimeSetting() {
         ARouter.getInstance()
                 .build(RouterPath.WebCenter.ACTIVITY_HTML)

+ 67 - 0
student/src/main/java/com/cooleshow/student/adapter/GroupCourseAppointAdapter.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.utils.GlideUtils;
+import com.cooleshow.base.utils.StringUtils;
+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 GroupCourseAppointAdapter extends BaseQuickAdapter<LiveCourseAppointListBean.RowsBean, BaseViewHolder> {
+    public GroupCourseAppointAdapter() {
+        super(R.layout.item_group_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());
+        //介绍\
+        String courseIntroduce = data.getCourseIntroduce();
+        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.getSubjectName());
+        //购买人数
+        holder.setText(R.id.tv_buy_num, UiUtils.getBuyNumTip(data.getCoursePrice(), String.valueOf(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()));
+        boolean isFree = UiUtils.isFree(data.getCoursePrice());
+        View tv_price_symbol = holder.getView(R.id.tv_price_symbol);
+        tv_price_symbol.setVisibility(isFree ? View.GONE : View.VISIBLE);
+
+        //剩余多少名额
+        String tip = String.format("剩余%d个名额", data.getMaxStudentNum() - data.getStudentCount());
+        holder.setText(R.id.tv_buy_num, tip);
+
+        //老师头像昵称
+        ImageView iv_avatar = holder.getView(R.id.iv_avatar);
+        GlideUtils.INSTANCE.loadImage(getContext(), data.getAvatar(), iv_avatar, R.drawable.icon_teacher_default_head);
+        TextView tv_teacher_name = holder.getView(R.id.tv_teacher_name);
+        tv_teacher_name.setText(data.getTeacherName());
+    }
+}

+ 6 - 1
student/src/main/java/com/cooleshow/student/adapter/LiveCourseAppointAdapter.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.adapter;
 
 import android.text.TextUtils;
+import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -40,7 +41,7 @@ public class LiveCourseAppointAdapter extends BaseQuickAdapter<LiveCourseAppoint
         //subjectName
         holder.setText(R.id.tv_course_name, data.getSubjectName());
         //购买人数
-        holder.setText(R.id.tv_buy_num, UiUtils.getBuyNumTip(data.getCoursePrice(), data.getStudentCount()));
+        holder.setText(R.id.tv_buy_num, UiUtils.getBuyNumTip(data.getCoursePrice(), String.valueOf(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);
@@ -49,6 +50,10 @@ public class LiveCourseAppointAdapter extends BaseQuickAdapter<LiveCourseAppoint
         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()));
+        boolean isFree = UiUtils.isFree(data.getCoursePrice());
+        View tv_price_symbol = holder.getView(R.id.tv_price_symbol);
+        tv_price_symbol.setVisibility(isFree ? View.GONE : View.VISIBLE);
+
 
         //老师头像昵称
         ImageView iv_avatar=holder.getView(R.id.iv_avatar);

+ 12 - 3
student/src/main/java/com/cooleshow/student/bean/LiveCourseAppointListBean.java

@@ -136,11 +136,20 @@ public class LiveCourseAppointListBean {
         private String salesStartDate;
         private String singleCourseMinutes;
         private String status;
-        private String studentCount;
+        private int studentCount;
         private String subjectName;
         private String teacherId;
         private String teacherName;
         private String userName;
+        private int maxStudentNum;
+
+        public int getMaxStudentNum() {
+            return maxStudentNum;
+        }
+
+        public void setMaxStudentNum(int maxStudentNum) {
+            this.maxStudentNum = maxStudentNum;
+        }
 
         public String getAvatar() {
             return avatar;
@@ -296,11 +305,11 @@ public class LiveCourseAppointListBean {
             this.singleCourseMinutes = singleCourseMinutes;
         }
 
-        public String getStudentCount() {
+        public int getStudentCount() {
             return studentCount;
         }
 
-        public void setStudentCount(String studentCount) {
+        public void setStudentCount(int studentCount) {
             this.studentCount = studentCount;
         }
 

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

@@ -14,4 +14,5 @@ public class LiveCourseEntry {
     public String subjectName;
     public boolean myself;
     public String search;
+    public String courseType;
 }

+ 1 - 0
student/src/main/java/com/cooleshow/student/constants/HomeMenuConstants.java

@@ -9,4 +9,5 @@ public class HomeMenuConstants {
     public static final String NATIVE_BOOKACCOMPANY = "native-bookAccompany";//约课-趣纠课
     public static final String NATIVE_BOOKLIVE = "native-bookLive";//约课-直播课
     public static final String NATIVE_BOOKVIDEO = "native-bookVideo";//约课-视频课
+    public static final String NATIVE_BOOKGROUP = "native-bookGroup";//约课-小组课
 }

+ 21 - 0
student/src/main/java/com/cooleshow/student/contract/GroupCourseAppointListContract.java

@@ -0,0 +1,21 @@
+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.
+ */
+public interface GroupCourseAppointListContract {
+
+    interface View extends BaseView {
+
+        void onGetLiveCourseSuccess(int page, LiveCourseAppointListBean data);
+
+        void onGetLiveCourseError(int page);
+
+    }
+
+    interface Presenter {
+    }
+}

+ 48 - 0
student/src/main/java/com/cooleshow/student/presenter/course/GroupCourseAppointListPresenter.java

@@ -0,0 +1,48 @@
+package com.cooleshow.student.presenter.course;
+
+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.student.api.APIService;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
+import com.cooleshow.student.bean.request.LiveCourseEntry;
+import com.cooleshow.student.contract.GroupCourseAppointListContract;
+import com.cooleshow.student.contract.LiveCourseAppointListContract;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class GroupCourseAppointListPresenter extends BasePresenter<GroupCourseAppointListContract.View> implements GroupCourseAppointListContract.Presenter {
+
+    public void queryGroupCourse(boolean isShowLoading,String subjectId, String search,int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        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;
+        liveCourseEntry.courseType = CourseType.GROUP.getId();
+        addSubscribe(create(APIService.class).queryPageCourseGroup(liveCourseEntry), new BaseObserver<LiveCourseAppointListBean>(getView()) {
+            @Override
+            protected void onSuccess(LiveCourseAppointListBean data) {
+                if (getView() != null) {
+                    getView().onGetLiveCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().onGetLiveCourseError(page);
+                }
+            }
+        });
+    }
+}

+ 2 - 0
student/src/main/java/com/cooleshow/student/presenter/course/LiveCourseAppointListPresenter.java

@@ -2,6 +2,7 @@ package com.cooleshow.student.presenter.course;
 
 import com.cooleshow.base.bean.SubjectListBean;
 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.base.utils.RequestBodyUtil;
@@ -32,6 +33,7 @@ public class LiveCourseAppointListPresenter extends BasePresenter<LiveCourseAppo
         liveCourseEntry.myself=false;
         liveCourseEntry.groupStatus ="APPLY";
         liveCourseEntry.search=search;
+        liveCourseEntry.courseType = CourseType.LIVE.getId();
         addSubscribe(create(APIService.class).queryPageCourseGroup(liveCourseEntry), new BaseObserver<LiveCourseAppointListBean>(getView()) {
             @Override
             protected void onSuccess(LiveCourseAppointListBean data) {

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

@@ -59,6 +59,7 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
     private LiveCourseAppointListFragment mLiveCourseAppointListFragment;
     private VideoCourseAppointListFragment mVideoCourseAppointListFragment;
     private CourseTipDialog mCourseTipDialog;
+    private GroupCourseAppointListFragment mCourseAppointListFragment;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -94,7 +95,7 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
     @Override
     public void initData() {
         super.initData();
-        titles = new ArrayList<String>(Arrays.asList("VIP定制课", "趣纠课", "直播课", "视频课"));
+        titles = new ArrayList<String>(Arrays.asList("VIP定制课", "趣纠课", "小组课", "直播课", "视频课"));
         initListener();
 
         initTabLayoutAndViewPager();
@@ -125,8 +126,10 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
         mInterestCorrectionCourseListFragment = InterestCorrectionCourseListFragment.newInstance();
         mLiveCourseAppointListFragment = LiveCourseAppointListFragment.newInstance();
         mVideoCourseAppointListFragment = VideoCourseAppointListFragment.newInstance();
+        mCourseAppointListFragment = GroupCourseAppointListFragment.newInstance();
         fragments.add(mVipCustomCourseListFragment);
         fragments.add(mInterestCorrectionCourseListFragment);
+        fragments.add(mCourseAppointListFragment);
         fragments.add(mLiveCourseAppointListFragment);
         fragments.add(mVideoCourseAppointListFragment);
         MineCoursePagerAdapter mineCoursePageAdapter = new MineCoursePagerAdapter(this);
@@ -185,6 +188,9 @@ public class AppointmentCourseActivity extends BaseMVPActivity<ActivityAppointme
         if (mInterestCorrectionCourseListFragment != null) {
             mInterestCorrectionCourseListFragment.querySubjectItemSuccess(data);
         }
+        if (mCourseAppointListFragment != null) {
+            mCourseAppointListFragment.querySubjectItemSuccess(data);
+        }
         if (mLiveCourseAppointListFragment != null) {
             mLiveCourseAppointListFragment.querySubjectItemSuccess(data);
         }

+ 279 - 0
student/src/main/java/com/cooleshow/student/ui/course/GroupCourseAppointListFragment.java

@@ -0,0 +1,279 @@
+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.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.bean.SubjectListBean;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.utils.UiUtils;
+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.student.R;
+import com.cooleshow.student.adapter.GroupCourseAppointAdapter;
+import com.cooleshow.student.adapter.LiveCourseAppointAdapter;
+import com.cooleshow.student.bean.LiveCourseAppointListBean;
+import com.cooleshow.student.contract.GroupCourseAppointListContract;
+import com.cooleshow.student.contract.LiveCourseAppointListContract;
+import com.cooleshow.student.databinding.FgGroupCourseAppointListLayoutBinding;
+import com.cooleshow.student.databinding.FgLiveCourseAppointListLayoutBinding;
+import com.cooleshow.student.presenter.course.GroupCourseAppointListPresenter;
+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.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Author by pq, Date on 2024/11/13.
+ * 小组课约课
+ */
+public class GroupCourseAppointListFragment extends BaseMVPFragment<FgGroupCourseAppointListLayoutBinding, GroupCourseAppointListPresenter> implements GroupCourseAppointListContract.View, View.OnClickListener {
+    private List<SubjectListBean.RowsBean> subjectBeanList = new ArrayList<>();
+    private GroupCourseAppointAdapter mAdapter;
+    private OptionsPickerView pvOptions;
+    private int currentSelectSubjectPosition = -1;
+    private String currentSubjectId;
+    private int currentPage = 1;
+    private boolean hasNext = true;
+    private String searchCondition;
+
+    public static GroupCourseAppointListFragment newInstance() {
+        GroupCourseAppointListFragment fragment = new GroupCourseAppointListFragment();
+        return fragment;
+    }
+
+    @Override
+    protected FgGroupCourseAppointListLayoutBinding getLayoutView() {
+        return FgGroupCourseAppointListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+        currentSubjectId = UserHelper.getSubjectId();
+        String subjectName = UserHelper.getSubjectName();
+        mViewBinding.tvFilter.setText(subjectName);
+
+        mAdapter = new GroupCourseAppointAdapter();
+        EmptyViewLayout emptyViewLayout = new EmptyViewLayout(getContext());
+        emptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
+        mAdapter.setEmptyView(emptyViewLayout);
+        RecyclerView.LayoutManager layoutManager;
+        if(QMUIDeviceHelper.isTablet(getContext())){
+            layoutManager = new GridLayoutManager(getContext(),2);
+            GridItemDecoration itemDecoration =new GridItemDecoration(2,0,0, SizeUtils.dp2px(6));
+            mViewBinding.recyclerViewList.addItemDecoration(itemDecoration);
+        }else{
+            layoutManager =new LinearLayoutManager(getContext());
+        }
+        mViewBinding.recyclerViewList.setLayoutManager(layoutManager);
+        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();
+                }
+            }
+        });
+
+        mAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                mAdapter.setOnItemClickListener(new OnItemClickListener() {
+                    @Override
+                    public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                        if(position<mAdapter.getData().size()){
+                            LiveCourseAppointListBean.RowsBean rowsBean = mAdapter.getData().get(position);
+                            WebStartHelper.startAppointmentGroupCourse(rowsBean.getCourseGroupId());
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    @Override
+    protected GroupCourseAppointListPresenter createPresenter() {
+        return new GroupCourseAppointListPresenter();
+    }
+
+    public void querySubjectItemSuccess(SubjectListBean subjectListBean) {
+        ArrayList<SubjectListBean.RowsBean> data = subjectListBean.getRows();
+        if (data != null) {
+            subjectBeanList.clear();
+            subjectBeanList.addAll(data);
+            if (currentSelectSubjectPosition == -1) {
+                String subjectId = UserHelper.getSubjectId();
+                for (int i = 0; i < data.size(); i++) {
+                    SubjectListBean.RowsBean rowsBean = data.get(i);
+                    if (TextUtils.equals(subjectId, rowsBean.getId())) {
+                        currentSelectSubjectPosition = i;
+                    }
+                }
+            }
+        }
+    }
+
+    @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();
+                        mAdapter.addData(dataList.getRows());
+                        checkHasNext(dataList.getRows().size());
+                    } 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.queryGroupCourse(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;
+                SubjectListBean.RowsBean 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();
+    }
+}

+ 6 - 2
student/src/main/java/com/cooleshow/student/ui/main/HomeMenuFragment.java

@@ -86,14 +86,18 @@ public class HomeMenuFragment extends BaseMVPFragment<FragmentHomeMenuBinding, H
                         startAppointmentCourseActivity(1);
                         return;
                     }
-                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKLIVE)) {
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKGROUP)) {
                         startAppointmentCourseActivity(2);
                         return;
                     }
-                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKVIDEO)) {
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKLIVE)) {
                         startAppointmentCourseActivity(3);
                         return;
                     }
+                    if (item.linkUrl.contains(HomeMenuConstants.NATIVE_BOOKVIDEO)) {
+                        startAppointmentCourseActivity(4);
+                        return;
+                    }
                     ARouter.getInstance()
                             .build(RouterPath.WebCenter.ACTIVITY_HTML)
                             .withString(WebConstants.WEB_URL, item.linkUrl)

+ 106 - 0
student/src/main/res/layout/fg_group_course_appoint_list_layout.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:paddingTop="12dp"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:drawableRight="@drawable/icon_arrow_down"
+        android:drawablePadding="6dp"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:maxLength="6"
+        android:maxLines="1"
+        android:paddingStart="13dp"
+        android:paddingEnd="8dp"
+        android:text="筛选"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_18dp"
+        app:layout_constraintLeft_toRightOf="@+id/tv_filter"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <com.cooleshow.base.widgets.ClearEditText
+        android:id="@+id/et_target_name"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:ellipsize="end"
+        android:hint="搜索你喜欢的老师"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:paddingStart="8dp"
+        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"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="56dp"
+        android:layout_height="28dp"
+        android:layout_marginEnd="3dp"
+        android:background="@drawable/shape_1ecdac_18dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+
+    <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/view_search_bg"
+        app:srlEnableLoadMore="true">
+
+        <androidx.recyclerview.widget.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" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 207 - 0
student/src/main/res/layout/item_group_course_appoint_layout.xml

@@ -0,0 +1,207 @@
+<?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: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: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"
+        tools:visibility="visible"
+        android:layout_marginEnd="5dp"
+        app:layout_constraintRight_toLeftOf="@+id/tv_price_symbol"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_teacher_name"
+        app:layout_constraintTop_toTopOf="@+id/tv_teacher_name"
+        app:layout_constraintLeft_toRightOf="@+id/tv_teacher_name"
+        android:includeFontPadding="false"
+        tools:text="6人已购买" />
+
+
+    <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="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_teacher_name" />
+
+    <TextView
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintRight_toLeftOf="@+id/tv_buy_num"
+        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="11dp"
+        android:includeFontPadding="false"
+        android:paddingStart="6dp"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_13"
+        android:visibility="visible"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintWidth_default="wrap"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintTop_toBottomOf="@+id/tv_des"
+        tools:text="严老师严" />
+
+    <TextView
+        android:id="@+id/tv_price"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="120"
+        android:paddingStart="3dp"
+        android:textColor="@color/color_f44541"
+        android:textSize="@dimen/sp_20"
+        android:textStyle="bold"
+        android:includeFontPadding="false"
+        app:layout_constraintTop_toTopOf="@+id/tv_teacher_name"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_teacher_name"
+        app:layout_constraintRight_toLeftOf="@+id/tv_price_unit" />
+
+    <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" />
+
+    <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>

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

@@ -49,7 +49,7 @@ public class GroupCourseListAdapter extends BaseQuickAdapter<MineLiveCourseListB
         //subjectName
         holder.setText(R.id.tv_course_name, data.subjectName);
         //购买人数
-        String tip = tip = String.format("剩余%d个名额", data.getMaxStudentNum() - data.getStudentCount());
+        String tip = String.format("剩余%d个名额", data.getMaxStudentNum() - data.getStudentCount());
         holder.setText(R.id.tv_buy_num, tip);
         //课程封面
         ImageView iv_bg = holder.getView(R.id.iv_bg);