Pārlūkot izejas kodu

增加老师端我的课程VIP课程组列表页

Pq 3 mēneši atpakaļ
vecāks
revīzija
e1dee39bff
20 mainītis faili ar 942 papildinājumiem un 155 dzēšanām
  1. 2 0
      BaseLibrary/src/main/java/com/cooleshow/base/constanst/Constants.java
  2. 35 0
      BaseLibrary/src/main/java/com/cooleshow/base/constanst/CourseGroupStatusType.java
  3. 1 1
      student/src/main/java/com/cooleshow/student/presenter/course/InterestCorrectionCourseListPresenter.java
  4. 1 1
      student/src/main/java/com/cooleshow/student/presenter/course/VIPCustomCourseListPresenter.java
  5. 0 2
      student/src/main/java/com/cooleshow/student/ui/course/InterestCorrectionCourseListFragment.java
  6. 56 0
      teacher/src/main/java/com/cooleshow/teacher/adapter/VIPCourseAdapter.java
  7. 9 0
      teacher/src/main/java/com/cooleshow/teacher/api/APIService.java
  8. 192 0
      teacher/src/main/java/com/cooleshow/teacher/bean/VIPCourseGroupListBean.java
  9. 22 0
      teacher/src/main/java/com/cooleshow/teacher/contract/VipCourseContract.java
  10. 60 0
      teacher/src/main/java/com/cooleshow/teacher/presenter/course/VipCoursePresenter.java
  11. 70 56
      teacher/src/main/java/com/cooleshow/teacher/ui/course/MineCourseActivity.java
  12. 167 0
      teacher/src/main/java/com/cooleshow/teacher/ui/course/VIPCourseGroupFragment.java
  13. BIN
      teacher/src/main/res/drawable-xhdpi/bg_appointment_top.png
  14. BIN
      teacher/src/main/res/drawable-xhdpi/icon_course_completed_tag.png
  15. BIN
      teacher/src/main/res/drawable-xxhdpi/bg_appointment_top.png
  16. BIN
      teacher/src/main/res/drawable-xxhdpi/icon_course_completed_tag.png
  17. 48 95
      teacher/src/main/res/layout/activity_mine_course_layout.xml
  18. 106 0
      teacher/src/main/res/layout/fg_vip_course_layout.xml
  19. 154 0
      teacher/src/main/res/layout/item_vip_course_layout.xml
  20. 19 0
      teacher/src/main/res/layout/view_mine_course_tab_layout.xml

+ 2 - 0
BaseLibrary/src/main/java/com/cooleshow/base/constanst/Constants.java

@@ -32,5 +32,7 @@ public class Constants {
     public static final int STUDENT_FOCUS_TEACHER_STATUS_NORMAL = 0;//取消关注
     public static final int STUDENT_FOCUS_TEACHER_STATUS_FOLLOW = 1;//关注
 
+    public static final String VIP_COURSE_TAG = "VIP";//VIP课type参数
+    public static final String INTEREST_COURSE_TAG = "PRACTICE";//趣纠课type参数
 
 }

+ 35 - 0
BaseLibrary/src/main/java/com/cooleshow/base/constanst/CourseGroupStatusType.java

@@ -0,0 +1,35 @@
+package com.cooleshow.base.constanst;
+
+import com.contrarywind.interfaces.IPickerViewData;
+
+/**
+ * Author by pq, Date on 2022/12/23.
+ */
+public enum CourseGroupStatusType implements IPickerViewData {
+    NOT("NOT", "未开始"),
+    ING("ING", "进行"),
+    COMPLETE("COMPLETE", "已结课"),
+    CANCEL("CANCEL", "已取消");
+
+
+    private final String value;
+    private final String id;
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    CourseGroupStatusType(String id, String s) {
+        this.id = id;
+        this.value = s;
+    }
+
+    @Override
+    public String getPickerViewText() {
+        return getValue();
+    }
+}

+ 1 - 1
student/src/main/java/com/cooleshow/student/presenter/course/InterestCorrectionCourseListPresenter.java

@@ -29,7 +29,7 @@ public class InterestCorrectionCourseListPresenter extends BasePresenter<Interes
         JSONObject jsonObject = new JSONObject();
         try {
             //类型
-            jsonObject.putOpt("courseType", "PRACTICE");
+            jsonObject.putOpt("courseType", Constants.INTEREST_COURSE_TAG);
             if (!TextUtils.isEmpty(subjectId)) {
                 //声部id
                 jsonObject.putOpt("subjectId", subjectId);

+ 1 - 1
student/src/main/java/com/cooleshow/student/presenter/course/VIPCustomCourseListPresenter.java

@@ -28,7 +28,7 @@ public class VIPCustomCourseListPresenter extends BasePresenter<VIPCustomCourseL
         JSONObject jsonObject = new JSONObject();
         try {
             //类型
-            jsonObject.putOpt("courseType", "VIP");
+            jsonObject.putOpt("courseType", Constants.VIP_COURSE_TAG);
             if (!TextUtils.isEmpty(subjectId)) {
                 //声部id
                 jsonObject.putOpt("subjectId", subjectId);

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

@@ -80,12 +80,10 @@ public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInte
         initListener();
         DataSortBean dataSortBean = new DataSortBean(DataSortType.RECENT_FREE_TIME);
         DataSortBean dataSortBean2 = new DataSortBean(DataSortType.HAS_COURSE);
-        DataSortBean dataSortBean3 = new DataSortBean(DataSortType.COURSE_PRICE);
         DataSortBean dataSortBean4 = new DataSortBean(DataSortType.COURSE_MARK);
         ArrayList<DataSortBean> list = new ArrayList();
         list.add(dataSortBean);
         list.add(dataSortBean2);
-        list.add(dataSortBean3);
         list.add(dataSortBean4);
         mViewBinding.sortView.setData(list);
 

+ 56 - 0
teacher/src/main/java/com/cooleshow/teacher/adapter/VIPCourseAdapter.java

@@ -0,0 +1,56 @@
+package com.cooleshow.teacher.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.constanst.CourseGroupStatusType;
+import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.teacher.R;
+import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2024/11/20.
+ */
+public class VIPCourseAdapter extends BaseQuickAdapter<VIPCourseGroupListBean.RowsBean, BaseViewHolder> {
+    public VIPCourseAdapter() {
+        super(R.layout.item_vip_course_layout);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, VIPCourseGroupListBean.RowsBean bean) {
+        ImageView iv_avatar = holder.getView(R.id.iv_avatar);
+        GlideUtils.INSTANCE.loadImage(getContext(), bean.getStudentAvatar(), iv_avatar, R.drawable.icon_teacher_default_head);
+
+        holder.setText(R.id.tv_title, bean.getCourseGroupName());
+        holder.setText(R.id.tv_name, bean.getStudentName());
+        holder.setText(R.id.tv_course_completed_value, bean.getCompleteCourseNum());
+        holder.setText(R.id.tv_course_total_value, bean.getCourseNum());
+        holder.setText(R.id.tv_course_name, bean.getSubjectName());
+
+        TextView tv_status = holder.getView(R.id.tv_status);
+        String status = bean.getStatus();
+        if (TextUtils.equals(status, CourseGroupStatusType.ING.getId())) {
+            //进行中
+            tv_status.setText(CourseGroupStatusType.ING.getValue());
+            tv_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        } else if (TextUtils.equals(status, CourseGroupStatusType.NOT.getId())) {
+            //未开始
+            tv_status.setText(CourseGroupStatusType.NOT.getValue());
+            tv_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_ff802c));
+        } else if (TextUtils.equals(status, CourseGroupStatusType.COMPLETE.getId())) {
+            //已结课
+            tv_status.setText(CourseGroupStatusType.COMPLETE.getValue());
+            tv_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        } else if (TextUtils.equals(status, CourseGroupStatusType.CANCEL.getId())) {
+            //已取消
+            tv_status.setText(CourseGroupStatusType.CANCEL.getValue());
+            tv_status.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_999999));
+        }
+    }
+}

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

@@ -16,6 +16,7 @@ import com.cooleshow.teacher.bean.LivePlayBackDataBean;
 import com.cooleshow.base.bean.StudentPageListBean;
 import com.cooleshow.teacher.bean.TeacherPromoteIncomeBean;
 import com.cooleshow.teacher.bean.UnBindTenantDetailBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
 import com.cooleshow.teacher.bean.request.AssignHomeWorkEntry;
 import com.cooleshow.teacher.bean.request.CommentHomeWorkEntry;
 import com.cooleshow.teacher.bean.request.LiveCourseEntry;
@@ -851,4 +852,12 @@ public interface APIService {
      */
     @GET(TEACHER_GROUP + "teacher/updateUserCustomerService")
     Observable<BaseResponse<String>> updateUserCustomerService();
+
+    /**
+     *
+     *获取VIP课程组或者趣纠课课程组
+     * @return
+     */
+    @POST(TEACHER_GROUP + "courseGroup/myCourseGroup")
+    Observable<BaseResponse<VIPCourseGroupListBean>> getCourseGroup(@Body RequestBody body);
 }

+ 192 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/VIPCourseGroupListBean.java

@@ -0,0 +1,192 @@
+package com.cooleshow.teacher.bean;
+
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2024/11/20.
+ */
+public class VIPCourseGroupListBean {
+
+    /**
+     * footer : [{"completeCourseNum":0,"courseGroupId":0,"courseGroupName":"","courseNum":0,"status":"","studentAvatar":"","studentName":"","subjectId":0,"subjectName":""}]
+     * limit : 0
+     * nextPage : 0
+     * offset : 0
+     * pageNo : 0
+     * prePage : 0
+     * rows : [{"completeCourseNum":0,"courseGroupId":0,"courseGroupName":"","courseNum":0,"status":"","studentAvatar":"","studentName":"","subjectId":0,"subjectName":""}]
+     * statInfo : {}
+     * total : 0
+     * totalPage : 0
+     */
+
+    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 {
+        /**
+         * completeCourseNum : 0
+         * courseGroupId : 0
+         * courseGroupName :
+         * courseNum : 0
+         * status :
+         * studentAvatar :
+         * studentName :
+         * subjectId : 0
+         * subjectName :
+         */
+
+        private String completeCourseNum;
+        private String courseGroupId;
+        private String courseGroupName;
+        private String courseNum;
+        private String status;
+        private String studentAvatar;
+        private String studentName;
+        private String subjectId;
+        private String subjectName;
+
+        public String getCompleteCourseNum() {
+            return completeCourseNum;
+        }
+
+        public void setCompleteCourseNum(String completeCourseNum) {
+            this.completeCourseNum = completeCourseNum;
+        }
+
+        public String getCourseGroupId() {
+            return courseGroupId;
+        }
+
+        public void setCourseGroupId(String courseGroupId) {
+            this.courseGroupId = courseGroupId;
+        }
+
+        public String getCourseGroupName() {
+            return courseGroupName;
+        }
+
+        public void setCourseGroupName(String courseGroupName) {
+            this.courseGroupName = courseGroupName;
+        }
+
+        public String getCourseNum() {
+            return courseNum;
+        }
+
+        public void setCourseNum(String courseNum) {
+            this.courseNum = courseNum;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getStudentAvatar() {
+            return studentAvatar;
+        }
+
+        public void setStudentAvatar(String studentAvatar) {
+            this.studentAvatar = studentAvatar;
+        }
+
+        public String getStudentName() {
+            return studentName;
+        }
+
+        public void setStudentName(String studentName) {
+            this.studentName = studentName;
+        }
+
+        public String getSubjectId() {
+            return subjectId;
+        }
+
+        public void setSubjectId(String subjectId) {
+            this.subjectId = subjectId;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+    }
+}

+ 22 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/VipCourseContract.java

@@ -0,0 +1,22 @@
+package com.cooleshow.teacher.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.teacher.bean.LiveCourseListBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface VipCourseContract {
+
+    interface View extends BaseView {
+        void onGetCourseGroupSuccess(int page, VIPCourseGroupListBean data);
+
+        void onGetCourseGroupError(int page);
+
+
+    }
+
+    interface Presenter {
+    }
+}

+ 60 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/course/VipCoursePresenter.java

@@ -0,0 +1,60 @@
+package com.cooleshow.teacher.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.teacher.api.APIService;
+import com.cooleshow.teacher.bean.LiveCourseListBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
+import com.cooleshow.teacher.contract.LiveCourseContract;
+import com.cooleshow.teacher.contract.VipCourseContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class VipCoursePresenter extends BasePresenter<VipCourseContract.View> implements VipCourseContract.Presenter {
+
+    public void queryVIPCourse(boolean isShowLoading, String status, String subjectId, String search, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (!TextUtils.isEmpty(status)) {
+                jsonObject.putOpt("status", status);
+            }
+            if (!TextUtils.isEmpty(subjectId)) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("search", search);
+            jsonObject.putOpt("courseType", Constants.VIP_COURSE_TAG);
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).getCourseGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<VIPCourseGroupListBean>(getView()) {
+            @Override
+            protected void onSuccess(VIPCourseGroupListBean data) {
+                if (getView() != null) {
+                    getView().onGetCourseGroupSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().onGetCourseGroupError(page);
+                }
+            }
+        });
+    }
+}

+ 70 - 56
teacher/src/main/java/com/cooleshow/teacher/ui/course/MineCourseActivity.java

@@ -1,7 +1,11 @@
 package com.cooleshow.teacher.ui.course;
 
+import android.graphics.Color;
 import android.graphics.Typeface;
 import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.cooleshow.base.router.RouterPath;
@@ -10,14 +14,15 @@ import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.MineCoursePageAdapter;
-import com.cooleshow.teacher.bean.CourseFilterStatusBean;
 import com.cooleshow.teacher.bean.QuerySubjectBean;
-import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.MineCourseContract;
 import com.cooleshow.teacher.databinding.ActivityMineCourseLayoutBinding;
 import com.cooleshow.teacher.presenter.course.MineCoursePresenter;
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import androidx.annotation.NonNull;
@@ -31,6 +36,7 @@ import androidx.viewpager2.widget.ViewPager2;
 @Route(path = RouterPath.CourseCenter.TEACHER_MINE_COURSE)
 public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayoutBinding, MineCoursePresenter> implements MineCourseContract.MineCourseView {
     public static final String SELECT_POSITION = "selectPosition";
+    private List<String> titles = new ArrayList<String>(Arrays.asList("VIP定制课","趣纠课", "直播课", "视频课", "琴房课"));
     private ArrayList<Fragment> mFragments = new ArrayList<>();
     private SparringCourseFragment mSparringCourseFragment;
     private LiveCourseFragment mLiveCourseFragment;
@@ -52,71 +58,28 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
     @Override
     protected void initView() {
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "我的课程");
-        viewBinding.radioGroup.setOnCheckedChangeListener((radioGroup, i) -> {
-                    if (i == R.id.rb_sparring) {
-                        viewBinding.viewPager.setCurrentItem(0, false);
-                    }
-                    if (i == R.id.rb_live_course) {
-                        viewBinding.viewPager.setCurrentItem(1, false);
-                    }
-                    if (i == R.id.rb_video_course) {
-                        viewBinding.viewPager.setCurrentItem(2, false);
-                    }
-                    if (i == R.id.rb_piano_room_course) {
-                        viewBinding.viewPager.setCurrentItem(3, false);
-                    }
-                }
-        );
-        viewBinding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
-            @Override
-            public void onPageSelected(int position) {
-                super.onPageSelected(position);
-                changeTableLayoutBar(position);
-                BaseMVPFragment fragment = (BaseMVPFragment) mFragments.get(position);
-                fragment.refreshData();
-            }
-        });
-    }
+        viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
 
-    private void changeTableLayoutBar(int position) {
-        if (position == 0) {
-            viewBinding.rbSparring.setChecked(true);
-            viewBinding.rbSparring.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
-            viewBinding.rbLiveCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbVideoCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbPianoRoomCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-        }
-        if (position == 1) {
-            viewBinding.rbLiveCourse.setChecked(true);
-            viewBinding.rbSparring.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbLiveCourse.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
-            viewBinding.rbVideoCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbPianoRoomCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-        }
-        if (position == 2) {
-            viewBinding.rbVideoCourse.setChecked(true);
-            viewBinding.rbSparring.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbLiveCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbVideoCourse.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
-            viewBinding.rbPianoRoomCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-        }
-        if (position == 3) {
-            viewBinding.rbPianoRoomCourse.setChecked(true);
-            viewBinding.rbSparring.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbLiveCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbVideoCourse.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
-            viewBinding.rbPianoRoomCourse.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
-        }
     }
 
+
     @Override
     public void initData() {
         super.initData();
+        initListener();
         int selectPosition = getIntent().getIntExtra(SELECT_POSITION, -1);
+
+        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(viewBinding.tablayout,  viewBinding.viewPager, (tab, position) -> {
+            //这里需要根据position修改tab的样式和文字等
+            createTab(tab, titles.get(position));
+        });
+
         mSparringCourseFragment = new SparringCourseFragment();
         mLiveCourseFragment = new LiveCourseFragment();
         mVideoCourseFragment = new VideoCourseFragment();
         mPianoRoomCourseFragment = new PianoRoomCourseFragment();
+        VIPCourseGroupFragment vipCourseFragment =new VIPCourseGroupFragment();
+        mFragments.add(vipCourseFragment);
         mFragments.add(mSparringCourseFragment);
         mFragments.add(mLiveCourseFragment);
         mFragments.add(mVideoCourseFragment);
@@ -125,6 +88,9 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
         mineCoursePageAdapter.setFragments(mFragments);
         viewBinding.viewPager.setAdapter(mineCoursePageAdapter);
         viewBinding.viewPager.setOffscreenPageLimit(mFragments.size());
+        tabLayoutMediator.attach();
+
+
         presenter.querySubjectItem();
         if (selectPosition != -1 && selectPosition < mFragments.size()) {
             viewBinding.viewPager.post(new Runnable() {
@@ -136,6 +102,46 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
         }
     }
 
+    private void initListener() {
+        viewBinding.tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                if (tab != null && tab.getCustomView() != null) {
+                    View customView = tab.getCustomView();
+                    TextView tv_text = customView.findViewById(com.cooleshow.chatmodule.R.id.tv_text);
+                    tv_text.setTextSize(16);
+                    tv_text.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_131415));
+                    tv_text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+                }
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+                if (tab != null && tab.getCustomView() != null) {
+                    View customView = tab.getCustomView();
+                    TextView tv_text = customView.findViewById(com.cooleshow.chatmodule.R.id.tv_text);
+                    tv_text.setTextSize(16);
+                    tv_text.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_80000000));
+                    tv_text.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
+                }
+            }
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+
+            }
+        });
+
+        viewBinding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                super.onPageSelected(position);
+                BaseMVPFragment fragment = (BaseMVPFragment) mFragments.get(position);
+                fragment.refreshData();
+            }
+        });
+    }
+
     @Override
     protected MineCoursePresenter createPresenter() {
         return new MineCoursePresenter();
@@ -156,4 +162,12 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
             mPianoRoomCourseFragment.querySubjectItemSuccess(data);
         }
     }
+
+    private TabLayout.Tab createTab(TabLayout.Tab tab, String text) {
+        View view = LayoutInflater.from(this).inflate(R.layout.view_mine_course_tab_layout, null);
+        TextView tv_text = view.findViewById(R.id.tv_text);
+        tv_text.setText(text);
+        tab.setCustomView(view);
+        return tab;
+    }
 }

+ 167 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/course/VIPCourseGroupFragment.java

@@ -0,0 +1,167 @@
+package com.cooleshow.teacher.ui.course;
+
+import android.view.View;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.LOG;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.teacher.adapter.VIPCourseAdapter;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
+import com.cooleshow.teacher.bean.VIPCourseGroupListBean;
+import com.cooleshow.teacher.contract.VipCourseContract;
+import com.cooleshow.teacher.databinding.FgVipCourseLayoutBinding;
+import com.cooleshow.teacher.presenter.course.VipCoursePresenter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
+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 2022/5/9.
+ */
+public class VIPCourseGroupFragment extends BaseMVPFragment<FgVipCourseLayoutBinding, VipCoursePresenter> implements VipCourseContract.View, View.OnClickListener {
+    private List<QuerySubjectBean> subjectList = new ArrayList<>();
+    private VIPCourseAdapter mAdapter;
+    private int currentPage = 1;
+    private boolean hasNext = true;
+    private String status = "";
+    private String currentSubjectId;
+    private String searchCondition;
+
+    @Override
+    protected void initView(View rootView) {
+
+        LinearLayoutManager manager = new LinearLayoutManager(getContext());
+        mViewBinding.recyclerViewList.setLayoutManager(manager);
+        mAdapter = new VIPCourseAdapter();
+        EmptyViewLayout mEmptyView = new EmptyViewLayout(getContext());
+        mEmptyView.setContent(com.cooleshow.base.R.drawable.icon_empty_course, "暂无课程");
+        mAdapter.setEmptyView(mEmptyView);
+        mViewBinding.recyclerViewList.setAdapter(mAdapter);
+    }
+
+
+    @Override
+    protected void initData() {
+        initListener();
+        getData(true);
+    }
+
+    private void initListener() {
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                getData(false);
+            }
+        });
+        mViewBinding.refreshLayout.setOnLoadMoreListener(new 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) {
+                //课程详情页
+            }
+        });
+    }
+
+    private void getData(boolean isLoading) {
+        if (currentPage == 1) {
+            mViewBinding.refreshLayout.resetNoMoreData();
+        }
+        presenter.queryVIPCourse(isLoading, status, currentSubjectId, searchCondition, currentPage);
+    }
+
+    @Override
+    protected FgVipCourseLayoutBinding getLayoutView() {
+        return FgVipCourseLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected VipCoursePresenter createPresenter() {
+        return new VipCoursePresenter();
+    }
+
+    @Override
+    public void onClick(View view) {
+    }
+
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+        mViewBinding.refreshLayout.setNoMoreData(!hasNext);
+    }
+
+    @Override
+    public void onGetCourseGroupSuccess(int page, VIPCourseGroupListBean dataList) {
+        if (isDetached()) {
+            return;
+        }
+        LOG.i("pq", "onGetCourseGroupSuccess:" + 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();
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onGetCourseGroupError(int page) {
+        if (isDetached()) {
+            return;
+        }
+        if (page == 1) {
+            mViewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mViewBinding.refreshLayout.finishLoadMore(false);
+            }
+        }
+    }
+}

BIN
teacher/src/main/res/drawable-xhdpi/bg_appointment_top.png


BIN
teacher/src/main/res/drawable-xhdpi/icon_course_completed_tag.png


BIN
teacher/src/main/res/drawable-xxhdpi/bg_appointment_top.png


BIN
teacher/src/main/res/drawable-xxhdpi/icon_course_completed_tag.png


+ 48 - 95
teacher/src/main/res/layout/activity_mine_course_layout.xml

@@ -1,104 +1,57 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <include
-        android:id="@+id/toolbar_include"
-        layout="@layout/common_toolbar_layout" />
-    <View
-        android:background="@color/white"
-        app:layout_constraintBottom_toBottomOf="@+id/radio_group"
-        app:layout_constraintTop_toBottomOf="@+id/toolbar_include"
+    <ImageView
         android:layout_width="match_parent"
-        android:layout_height="0dp"/>
-
-    <RadioGroup
-        android:layout_marginTop="10dp"
-        android:id="@+id/radio_group"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_40"
-        android:gravity="center_vertical"
-        android:orientation="horizontal"
-        app:layout_constraintTop_toBottomOf="@+id/toolbar_include">
-
-        <RadioButton
-            android:id="@+id/rb_sparring"
-            android:layout_width="@dimen/dp_0"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:button="@null"
-            android:checked="true"
-            android:drawableBottom="@drawable/btn_radio_bottom_line_selector"
-            android:drawablePadding="@dimen/dp_8"
-            android:gravity="center"
-            android:text="陪练课"
-            android:textColor="@drawable/btn_radio_text_color_selector_stu"
-            android:textSize="@dimen/sp_17"
-            android:textStyle="bold" />
-
-
-        <RadioButton
-            android:id="@+id/rb_live_course"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:button="@null"
-            android:drawableBottom="@drawable/btn_radio_bottom_line_selector"
-            android:drawablePadding="@dimen/dp_8"
-            android:gravity="center"
-            android:text="直播课"
-            android:textColor="@drawable/btn_radio_text_color_selector_stu"
-            android:textSize="@dimen/sp_17" />
-
-
-        <RadioButton
-            android:id="@+id/rb_video_course"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:button="@null"
-            android:drawableBottom="@drawable/btn_radio_bottom_line_selector"
-            android:drawablePadding="@dimen/dp_8"
-            android:gravity="center"
-            android:text="视频课"
-            android:textColor="@drawable/btn_radio_text_color_selector_stu"
-            android:textSize="@dimen/sp_17" />
-
-        <RadioButton
-            android:id="@+id/rb_piano_room_course"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:button="@null"
-            android:drawableBottom="@drawable/btn_radio_bottom_line_selector"
-            android:drawablePadding="@dimen/dp_8"
-            android:gravity="center"
-            android:text="琴房课"
-            android:textColor="@drawable/btn_radio_text_color_selector_stu"
-            android:textSize="@dimen/sp_17" />
-    </RadioGroup>
-
-    <View
-        android:visibility="gone"
-        android:id="@+id/top_line"
-        android:layout_width="match_parent"
-        android:layout_height="1px"
-        android:background="@color/color_ededed"
+        android:layout_height="wrap_content"
+        android:adjustViewBounds="true"
+        android:src="@drawable/bg_appointment_top"
         app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/radio_group" />
+        app:layout_constraintTop_toTopOf="parent" />
 
-    <androidx.viewpager2.widget.ViewPager2
-        android:id="@+id/view_pager"
-        android:scrollbars="none"
-        android:overScrollMode="never"
+    <LinearLayout
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/radio_group" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <include
+            android:id="@+id/toolbar_include"
+            layout="@layout/common_toolbar_layout" />
+
+        <com.google.android.material.tabs.TabLayout
+            android:id="@+id/tablayout"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_44"
+            android:scrollbars="none"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/toolbar_include"
+            app:tabBackground="@null"
+            app:tabGravity="fill"
+            app:tabIndicator="@drawable/tab_indicator"
+            app:tabIndicatorColor="@color/color_2dc7aa"
+            app:tabIndicatorFullWidth="false"
+            app:tabIndicatorHeight="4dp"
+            app:tabMode="scrollable"
+            app:tabRippleColor="@null"
+            app:tabPaddingEnd="0dp"
+            app:tabPaddingStart="0dp"
+            app:tabSelectedTextColor="@color/black_333"
+            app:tabTextAppearance="@style/tab_layout_style"
+            app:tabTextColor="@color/color_666666" />
+
+        <androidx.viewpager2.widget.ViewPager2
+            android:id="@+id/view_pager"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tablayout" />
+    </LinearLayout>
+</FrameLayout>

+ 106 - 0
teacher/src/main/res/layout/fg_vip_course_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="10dp"
+    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="wrap_content"
+        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>

+ 154 - 0
teacher/src/main/res/layout/item_vip_course_layout.xml

@@ -0,0 +1,154 @@
+<?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:padding="12dp">
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_131415"
+        android:textSize="@dimen/sp_16"
+        android:textStyle="bold"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toLeftOf="@+id/tv_status"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="VIP定制课-张涵宇" />
+
+    <TextView
+        android:id="@+id/tv_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_title"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_title"
+        tools:text="已结课" />
+
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/iv_avatar"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_marginTop="8dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="5dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintBottom_toTopOf="@+id/tv_course_completed_title"
+        app:layout_constraintHorizontal_bias="0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintRight_toLeftOf="@+id/tv_course_name"
+        app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+        app:layout_constraintVertical_chainStyle="packed"
+        app:layout_constraintWidth_default="wrap"
+        tools:text="张涵宇" />
+
+
+    <TextView
+        android:id="@+id/tv_course_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="5dp"
+        android:background="@drawable/shape_couse_type_text_bg"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingStart="4dp"
+        android:paddingTop="2dp"
+        android:paddingEnd="4dp"
+        android:paddingBottom="2dp"
+        android:textColor="@color/color_ff8c00"
+        android:textSize="@dimen/sp_10"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_name"
+        app:layout_constraintLeft_toRightOf="@+id/tv_name"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_name"
+        tools:text="单簧管" />
+
+    <ImageView
+        android:id="@+id/iv_course_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/icon_course_completed_tag"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_course_completed_title"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_name"
+        app:layout_constraintTop_toTopOf="@+id/tv_course_completed_title" />
+
+    <TextView
+        android:id="@+id/tv_course_completed_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="4dp"
+        android:layout_marginTop="5dp"
+        android:includeFontPadding="false"
+        android:text="已上课时"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintLeft_toRightOf="@+id/iv_course_tag"
+        app:layout_constraintTop_toBottomOf="@+id/tv_name" />
+
+
+    <TextView
+        android:id="@+id/tv_course_completed_value"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:paddingStart="3dp"
+        android:paddingEnd="3dp"
+        android:text="0"
+        android:textColor="@color/color_2dc7aa"
+        android:textSize="@dimen/sp_12"
+        android:textStyle="bold"
+        app:layout_constraintBaseline_toBaselineOf="@+id/tv_course_completed_title"
+        app:layout_constraintLeft_toRightOf="@+id/tv_course_completed_title" />
+
+    <TextView
+        android:id="@+id/tv_course_total_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:text="/总课时"
+        android:textColor="@color/color_999999"
+        android:textSize="@dimen/sp_12"
+        app:layout_constraintBaseline_toBaselineOf="@+id/tv_course_completed_value"
+        app:layout_constraintLeft_toRightOf="@+id/tv_course_completed_value" />
+
+
+    <TextView
+        android:id="@+id/tv_course_total_value"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:paddingStart="3dp"
+        android:paddingEnd="3dp"
+        android:text="0"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_12"
+        android:textStyle="bold"
+        app:layout_constraintBaseline_toBaselineOf="@+id/tv_course_total_title"
+        app:layout_constraintLeft_toRightOf="@+id/tv_course_total_title" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 19 - 0
teacher/src/main/res/layout/view_mine_course_tab_layout.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_gravity="center"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+    <TextView
+        android:paddingStart="15dp"
+        android:paddingEnd="15dp"
+        tools:text="哈哈"
+        android:gravity="center"
+        android:layout_gravity="center"
+        android:includeFontPadding="false"
+        android:textSize="@dimen/sp_16"
+        android:textColor="@color/color_666666"
+        android:id="@+id/tv_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</FrameLayout>