Просмотр исходного кода

Merge branch 'dev' of http://git.dayaedu.com/yonge/cooleshow_android into dev

Pq 3 лет назад
Родитель
Сommit
8d030671fc
28 измененных файлов с 798 добавлено и 617 удалено
  1. 40 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/poplist/CourseStatusFilterAdapter.java
  2. 40 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/poplist/PopMenuBean.java
  3. 81 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/poplist/PopupListWindow.java
  4. 0 1
      student/src/main/java/com/cooleshow/student/contract/LiveCourseContract.java
  5. 4 0
      student/src/main/java/com/cooleshow/student/contract/MineCourseContract.java
  6. 0 2
      student/src/main/java/com/cooleshow/student/contract/MinePracticeCourseContract.java
  7. 0 2
      student/src/main/java/com/cooleshow/student/contract/VideoCourseContract.java
  8. 0 17
      student/src/main/java/com/cooleshow/student/presenter/course/LiveCoursePresenter.java
  9. 21 0
      student/src/main/java/com/cooleshow/student/presenter/course/MineCoursePresenter.java
  10. 0 16
      student/src/main/java/com/cooleshow/student/presenter/course/MinePracticeCoursePresenter.java
  11. 0 17
      student/src/main/java/com/cooleshow/student/presenter/course/VideoCoursePresenter.java
  12. 85 122
      student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java
  13. 30 7
      student/src/main/java/com/cooleshow/student/ui/course/MineCourseActivity.java
  14. 57 84
      student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java
  15. 46 63
      student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java
  16. 8 1
      teacher/src/main/java/com/cooleshow/teacher/api/APIService.java
  17. 65 0
      teacher/src/main/java/com/cooleshow/teacher/bean/QuerySubjectBean.java
  18. 5 1
      teacher/src/main/java/com/cooleshow/teacher/contract/MineCourseContract.java
  19. 20 0
      teacher/src/main/java/com/cooleshow/teacher/presenter/course/MineCoursePresenter.java
  20. 47 44
      teacher/src/main/java/com/cooleshow/teacher/ui/course/LiveCourseFragment.java
  21. 39 14
      teacher/src/main/java/com/cooleshow/teacher/ui/course/MineCourseActivity.java
  22. 65 69
      teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoRoomCourseFragment.java
  23. 79 94
      teacher/src/main/java/com/cooleshow/teacher/ui/course/SparringCourseFragment.java
  24. 35 45
      teacher/src/main/java/com/cooleshow/teacher/ui/course/VideoCourseFragment.java
  25. 9 5
      teacher/src/main/res/layout/fragment_live_course_layout.xml
  26. 9 5
      teacher/src/main/res/layout/fragment_piano_room_course_layout.xml
  27. 11 7
      teacher/src/main/res/layout/fragment_sparring_course_layout.xml
  28. 2 1
      teacher/src/main/res/layout/fragment_video_course_layout.xml

+ 40 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/poplist/CourseStatusFilterAdapter.java

@@ -0,0 +1,40 @@
+package com.cooleshow.base.widgets.poplist;
+
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.cooleshow.base.R;
+
+/**
+ * Author by pq, Date on 2022/4/25.
+ */
+public class CourseStatusFilterAdapter extends BaseQuickAdapter<PopMenuBean, BaseViewHolder> {
+    private int selectPosition = -1;
+
+    public CourseStatusFilterAdapter() {
+        super(R.layout.notice_popu_list_item);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, PopMenuBean bean) {
+        holder.setText(R.id.tv_title, bean.getActionName());
+        TextView tv_title = holder.getView(R.id.tv_title);
+        if (getItemPosition(bean) == selectPosition) {
+            tv_title.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        } else {
+            tv_title.setTextColor(getContext().getResources().getColor(com.cooleshow.base.R.color.black_333));
+        }
+    }
+
+    public int getSelectPosition() {
+        return selectPosition;
+    }
+
+    public void setSelect(int selectPosition) {
+        this.selectPosition = selectPosition;
+        notifyDataSetChanged();
+    }
+}

+ 40 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/poplist/PopMenuBean.java

@@ -0,0 +1,40 @@
+package com.cooleshow.base.widgets.poplist;
+
+import android.graphics.Bitmap;
+
+/**
+ * @author dengqw
+ * @time 2022/6/28 10:38
+ * @describe:
+ **/
+public class PopMenuBean {
+    private String actionName;
+    private Bitmap icon;
+    private int iconResId;
+
+    public String getActionName() {
+        return actionName;
+    }
+
+    public void setActionName(String actionName) {
+        this.actionName = actionName;
+    }
+
+    public Bitmap getIcon() {
+        return icon;
+    }
+
+    public void setIcon(Bitmap mIcon) {
+        this.icon = mIcon;
+    }
+
+
+    public int getIconResId() {
+        return iconResId;
+    }
+
+    public void setIconResId(int iconResId) {
+        this.iconResId = iconResId;
+    }
+
+}

+ 81 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/poplist/PopupListWindow.java

@@ -0,0 +1,81 @@
+package com.cooleshow.base.widgets.poplist;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.PopupWindow;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.cooleshow.base.R;
+import com.cooleshow.base.utils.PopupUtil;
+
+import java.util.List;
+
+/**
+ * @author dengqw
+ * @time 2022/6/28 10:24
+ * @describe:
+ **/
+public class PopupListWindow {
+
+    private Context mContext;
+    private View mAnchorView;
+    private List<PopMenuBean> mPopupItemList;
+    private PopupListListener mPopupListListener;
+    private PopupWindow mPopupWindow;
+
+    public PopupListWindow(Context context) {
+        mContext = context;
+    }
+
+    public void showListPop(View anchorView, List<PopMenuBean> popupItemList, PopupListListener popupListListener) {
+        this.mAnchorView = anchorView;
+        this.mPopupItemList = popupItemList;
+        this.mPopupListListener = popupListListener;
+        this.mPopupWindow = null;
+        showPopupListWindow();
+    }
+
+    private void showPopupListWindow() {
+        if (mContext instanceof Activity && ((Activity) mContext).isFinishing()) {
+            return;
+        }
+        if (mPopupWindow == null) {
+            View popupContentView = LayoutInflater.from(mContext).inflate(R.layout.list_popu_layout, null);
+            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
+            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
+            bg.setOnClickListener(v -> {
+                if (mPopupWindow != null) {
+                    mPopupWindow.dismiss();
+                }
+            });
+            CourseStatusFilterAdapter listAdapter = new CourseStatusFilterAdapter();
+            listAdapter.setOnItemClickListener((adapter, view, position) -> {
+                PopMenuBean bean = listAdapter.getData().get(position);
+                if (listAdapter != null) {
+                    listAdapter.setSelect(position);
+                }
+                if (mPopupListListener != null) {
+                    mPopupListListener.onPopupListClick(position);
+                }
+                mPopupWindow.dismiss();
+            });
+            recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
+            recyclerView.setAdapter(listAdapter);
+            listAdapter.setNewInstance(mPopupItemList);
+            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, mContext, ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
+        }
+        if (!mPopupWindow.isShowing()) {
+            mPopupWindow.showAsDropDown(mAnchorView);
+        }
+    }
+
+    public interface PopupListListener {
+        void onPopupListClick(int position);
+    }
+}

+ 0 - 1
student/src/main/java/com/cooleshow/student/contract/LiveCourseContract.java

@@ -16,7 +16,6 @@ public interface LiveCourseContract {
 
         void onGetCourseError(int page);
 
-        void querySubjectItemSuccess(List<QuerySubjectBean> data);
     }
 
     interface Presenter {

+ 4 - 0
student/src/main/java/com/cooleshow/student/contract/MineCourseContract.java

@@ -1,6 +1,9 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.QuerySubjectBean;
+
+import java.util.List;
 
 /**
  * 创建日期:2022/5/30 9:26
@@ -10,6 +13,7 @@ import com.cooleshow.base.presenter.view.BaseView;
  */
 public interface MineCourseContract {
     interface MineCourseView extends BaseView {
+        void querySubjectItemSuccess(List<QuerySubjectBean> data);
     }
 
     interface Presenter {

+ 0 - 2
student/src/main/java/com/cooleshow/student/contract/MinePracticeCourseContract.java

@@ -17,8 +17,6 @@ public interface MinePracticeCourseContract {
         void onGetPracticeCourseSuccess(int page, PracticeCourseListBean sparringCourseBean);
 
         void onGetCourseError(int page);
-
-        void querySubjectItemSuccess(List<QuerySubjectBean> data);
     }
 
     interface Presenter {

+ 0 - 2
student/src/main/java/com/cooleshow/student/contract/VideoCourseContract.java

@@ -17,8 +17,6 @@ public interface VideoCourseContract {
 
         void onGetCourseError(int page);
 
-        void querySubjectItemSuccess(List<QuerySubjectBean> data);
-
     }
 
     interface Presenter {

+ 0 - 17
student/src/main/java/com/cooleshow/student/presenter/course/LiveCoursePresenter.java

@@ -55,21 +55,4 @@ public class LiveCoursePresenter extends BasePresenter<LiveCourseContract.LiveCo
             }
         });
     }
-
-    public void querySubjectItem() {
-        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
-            @Override
-            protected void onSuccess(List<QuerySubjectBean> data) {
-                if (getView() != null) {
-                    getView().querySubjectItemSuccess(data);
-                }
-            }
-
-            @Override
-            public void onError(Throwable e) {
-                super.onError(e);
-
-            }
-        });
-    }
 }

+ 21 - 0
student/src/main/java/com/cooleshow/student/presenter/course/MineCoursePresenter.java

@@ -1,8 +1,13 @@
 package com.cooleshow.student.presenter.course;
 
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.QuerySubjectBean;
 import com.cooleshow.student.contract.MineCourseContract;
 
+import java.util.List;
+
 /**
  * 创建日期:2022/5/30 9:25
  *
@@ -11,4 +16,20 @@ import com.cooleshow.student.contract.MineCourseContract;
  */
 public class MineCoursePresenter extends BasePresenter<MineCourseContract.MineCourseView> implements MineCourseContract.Presenter {
 
+    public void querySubjectItem() {
+        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<QuerySubjectBean> data) {
+                if (getView() != null) {
+                    getView().querySubjectItemSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+
+            }
+        });
+    }
 }

+ 0 - 16
student/src/main/java/com/cooleshow/student/presenter/course/MinePracticeCoursePresenter.java

@@ -57,20 +57,4 @@ public class MinePracticeCoursePresenter extends BasePresenter<MinePracticeCours
         });
     }
 
-    public void querySubjectItem() {
-        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
-            @Override
-            protected void onSuccess(List<QuerySubjectBean> data) {
-                if (getView() != null) {
-                    getView().querySubjectItemSuccess(data);
-                }
-            }
-
-            @Override
-            public void onError(Throwable e) {
-                super.onError(e);
-
-            }
-        });
-    }
 }

+ 0 - 17
student/src/main/java/com/cooleshow/student/presenter/course/VideoCoursePresenter.java

@@ -55,21 +55,4 @@ public class VideoCoursePresenter extends BasePresenter<VideoCourseContract.Vide
             }
         });
     }
-
-    public void querySubjectItem() {
-        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
-            @Override
-            protected void onSuccess(List<QuerySubjectBean> data) {
-                if (getView() != null) {
-                    getView().querySubjectItemSuccess(data);
-                }
-            }
-
-            @Override
-            public void onError(Throwable e) {
-                super.onError(e);
-
-            }
-        });
-    }
 }

+ 85 - 122
student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.student.ui.course;
 
+import android.annotation.SuppressLint;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -31,6 +32,8 @@ import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
 
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.student.adapter.LiveCourseListAdapter;
@@ -60,12 +63,9 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
     private int currentPage;
     private LiveCourseListAdapter mAdapter;
     private EmptyViewLayout mEmptyView;
-    private TextView mTvEmptyTip;
-    private ImageView mEmptyIcon;
     private TimePickerView pvTime;
-    private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
-    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
     private boolean hasNext = true;
     private boolean isFirstLoad = true;
 
@@ -73,6 +73,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         LiveCourseFragment fragment = new LiveCourseFragment();
         return fragment;
     }
+
     @Override
     protected FragmentLiveCourseLayoutBinding getLayoutView() {
         return FragmentLiveCourseLayoutBinding.inflate(getLayoutInflater());
@@ -89,10 +90,11 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         mViewBinding.tvCourseStatus.setOnClickListener(this);
         mViewBinding.tvAgency.setOnClickListener(this);
     }
+
     @Override
     public void onResume() {
         super.onResume();
-        if(isFirstLoad){
+        if (isFirstLoad) {
             isFirstLoad = false;
             reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
         }
@@ -104,6 +106,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         reBuildFilter(currentSelectDate, currentCourseFilterStatus);
         isFirstLoad = false;
     }
+
     private void buildDefaultCourseStatusFilterList() {
         mCourseFilterStatusBeans = new ArrayList<>();
         mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
@@ -128,41 +131,30 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
 
     @Override
     protected void initData() {
-        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
-            @Override
-            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
-                currentPage = 1;
-                queryCourse(true);
-            }
+        mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> {
+            currentPage = 1;
+            queryCourse(true);
         });
 
         mAdapter = new LiveCourseListAdapter(R.layout.item_live_course_list_layout);
-//        mAdapter.getLoadMoreModule().setEnableLoadMoreIfNotFullPage(false);
-        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
-            @Override
-            public void onLoadMore() {
-                //上拉加载
-                if (hasNext) {
-                    currentPage++;
-                    queryCourse(false);
-                } else {
-                    mAdapter.getLoadMoreModule().loadMoreEnd();
-                }
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(() -> {
+            //上拉加载
+            if (hasNext) {
+                currentPage++;
+                queryCourse(false);
+            } else {
+                mAdapter.getLoadMoreModule().loadMoreEnd();
             }
         });
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
-        presenter.querySubjectItem();
         buildDefaultCourseStatusFilterList();
-        mAdapter.setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                LiveCourseListBean.RowsBean item = (LiveCourseListBean.RowsBean) adapter.getItem(position);
-                ARouter.getInstance()
-                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
-                        .withString(WebConstants.WEB_URL, WebConstants.TEACHER_LIVE_DETAIL + "?groupId=" + item.courseGroupId)
-                        .navigation();
-            }
+        mAdapter.setOnItemClickListener((adapter, view, position) -> {
+            LiveCourseListBean.RowsBean item = (LiveCourseListBean.RowsBean) adapter.getItem(position);
+            ARouter.getInstance()
+                    .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                    .withString(WebConstants.WEB_URL, WebConstants.TEACHER_LIVE_DETAIL + "?groupId=" + item.courseGroupId)
+                    .navigation();
         });
     }
 
@@ -180,6 +172,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
     }
 
 
+    @SuppressLint("NotifyDataSetChanged")
     @Override
     public void onGetLiveCourseSuccess(int page, LiveCourseListBean liveCourseListBean) {
         if (isDetached()) {
@@ -242,22 +235,16 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         if (pvTime == null) {
             pvTime = new TimePickerBuilder(requireContext(), (date, v) -> {//选中事件回调
                 reBuildFilter(date, currentCourseFilterStatus);
-            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout, new CustomListener() {
-                @Override
-                public void customLayout(View v) {
-                    //自定义布局中的控件初始化及事件处理
-                    final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
-                    TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
-                    tvSubmit.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            pvTime.returnData();
-                            pvTime.dismiss();
-                        }
-                    });
-                    ivCancel.setOnClickListener(v1 -> pvTime.dismiss());
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_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 -> {
+                    pvTime.returnData();
+                    pvTime.dismiss();
+                });
+                ivCancel.setOnClickListener(v1 -> pvTime.dismiss());
 
-                }
             }).setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -273,44 +260,6 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         }
     }
 
-    private void initPopu(View targetView) {
-        if (mPopupWindow == null) {
-            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
-            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
-            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
-            bg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mPopupWindow != null) {
-                        mPopupWindow.dismiss();
-                    }
-                }
-            });
-            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
-            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
-                @Override
-                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                    Object object = mCourseStatusFilterAdapter.getData().get(position);
-                    if (object instanceof CourseFilterStatusBean) {
-                        if (mCourseStatusFilterAdapter != null) {
-                            mCourseStatusFilterAdapter.setSelect(position);
-                        }
-                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
-                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
-                        reBuildFilter(currentSelectDate, filterStatusBean.value);
-                    }
-                    mPopupWindow.dismiss();
-                }
-            });
-            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
-            recyclerView.setAdapter(mCourseStatusFilterAdapter);
-            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
-            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
-        }
-        mPopupWindow.showAsDropDown(targetView);
-    }
-
     @Override
     public void onClick(View v) {
         if (v.getId() == R.id.tv_time) {
@@ -321,60 +270,74 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
 
         if (v.getId() == R.id.tv_course_status) {
             //课程状态筛选
-            initPopu(mViewBinding.tvCourseStatus);
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (CourseFilterStatusBean bean : mCourseFilterStatusBeans) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.showText);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                CourseFilterStatusBean bean = mCourseFilterStatusBeans.get(position);
+                mViewBinding.tvCourseStatus.setText(bean.showText);
+                reBuildFilter(currentSelectDate, bean.value);
+            });
             return;
         }
 
-        if (v.getId()==R.id.tv_agency){
+        if (v.getId() == R.id.tv_agency) {
             //选择声部
-            selectSubject();
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvAgency.setText(bean.name);
+                queryCourse(true);
+            });
             return;
         }
     }
 
-    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
 
-    @Override
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
+    }
+
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
         subjectBeanList.clear();
-        subjectBeanList.add(new QuerySubjectBean("全部声部",0));
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
         subjectBeanList.addAll(data);
     }
 
     private OptionsPickerView pvOptions;
+
     private void selectSubject() {
-        pvOptions = new OptionsPickerBuilder(getContext(), new OnOptionsSelectListener() {
-            @Override
-            public void onOptionsSelect(int options1, int options2, int options3, View v) {
-                currentSubjectId=subjectBeanList.get(options1).id;
-                mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
-                queryCourse(true);
-            }
-        })
-                .setLayoutRes(R.layout.pickerview_address_layout, new CustomListener() {
-                    @Override
-                    public void customLayout(View v) {
-                        //自定义布局中的控件初始化及事件处理
-                        final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
-                        TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
-                        tvSubmit.setOnClickListener(new View.OnClickListener() {
-                            @Override
-                            public void onClick(View v) {
-                                pvOptions.returnData();
-                                pvOptions.dismiss();
-                            }
-                        });
-                        ivCancel.setOnClickListener(new View.OnClickListener() {
-                            @Override
-                            public void onClick(View v) {
-                                pvOptions.dismiss();
-                            }
-                        });
+        if (subjectBeanList.size() == 0) {
+            subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        }
+        pvOptions = new OptionsPickerBuilder(getContext(), (options1, options2, options3, v) -> {
+            currentSubjectId = subjectBeanList.get(options1).id;
+            mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
+            queryCourse(true);
+        }).setLayoutRes(R.layout.pickerview_address_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());
 
-                    }
-                })
-                .isDialog(false)
-                .build();
+        }).isDialog(false).build();
         pvOptions.setPicker(subjectBeanList);
         pvOptions.show();
 

+ 30 - 7
student/src/main/java/com/cooleshow/student/ui/course/MineCourseActivity.java

@@ -12,6 +12,8 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.student.adapter.MineCoursePagerAdapter;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.MineCourseContract;
 import com.cooleshow.student.databinding.ActivityMineCourseBinding;
 import com.cooleshow.student.presenter.course.MineCoursePresenter;
 import com.google.android.material.tabs.TabLayout;
@@ -30,11 +32,17 @@ import io.rong.imkit.utils.StatusBarUtil;
  * 类说明:
  */
 @Route(path = RouterPath.CourseCenter.TEACHER_MINE_COURSE)
-public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBinding, MineCoursePresenter> {
+public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBinding, MineCoursePresenter> implements MineCourseContract.MineCourseView {
 
 
     private TabLayout tabLayout;
     private ViewPager2 viewPager;
+    private List<String> titles = new ArrayList<String>(Arrays.asList("陪练课", "直播课", "视频课"));
+    private List<BaseMVPFragment> fragments = new ArrayList<>();
+    private MinePracticeCourseFragment mMinePracticeCourseFragment;
+    private LiveCourseFragment mLiveCourseFragment;
+    private VideoCourseFragment mVideoCourseFragment;
+
     @Override
     protected void initView() {
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "我的课程");
@@ -42,11 +50,13 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBindin
         viewPager = viewBinding.viewpager;
         viewPager.setCurrentItem(0);
     }
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         StatusBarUtil.setStatusBarDarkTheme(this, true);
     }
+
     @Override
     protected ActivityMineCourseBinding getLayoutView() {
         return ActivityMineCourseBinding.inflate(getLayoutInflater());
@@ -61,15 +71,16 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBindin
     public void initData() {
         super.initData();
         initTabLayoutAndViewPager();
+        presenter.querySubjectItem();
     }
 
-    private List<String> titles = new ArrayList<String>(Arrays.asList("陪练课", "直播课", "视频课"));
-    private List<BaseMVPFragment> fragments = new ArrayList<>();
-
     private void initTabLayoutAndViewPager() {
-        fragments.add(MinePracticeCourseFragment.newInstance());
-        fragments.add(LiveCourseFragment.newInstance());
-        fragments.add(VideoCourseFragment.newInstance());
+        mMinePracticeCourseFragment = MinePracticeCourseFragment.newInstance();
+        mLiveCourseFragment = LiveCourseFragment.newInstance();
+        mVideoCourseFragment = VideoCourseFragment.newInstance();
+        fragments.add(mMinePracticeCourseFragment);
+        fragments.add(mLiveCourseFragment);
+        fragments.add(mVideoCourseFragment);
         MineCoursePagerAdapter mineCoursePageAdapter = new MineCoursePagerAdapter(this);
         mineCoursePageAdapter.setFragments(fragments);
         viewPager.setAdapter(mineCoursePageAdapter);
@@ -107,4 +118,16 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBindin
         });
     }
 
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        if (mMinePracticeCourseFragment != null) {
+            mMinePracticeCourseFragment.querySubjectItemSuccess(data);
+        }
+        if (mLiveCourseFragment != null) {
+            mLiveCourseFragment.querySubjectItemSuccess(data);
+        }
+        if (mVideoCourseFragment != null) {
+            mVideoCourseFragment.querySubjectItemSuccess(data);
+        }
+    }
 }

+ 57 - 84
student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java

@@ -28,6 +28,8 @@ import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.student.adapter.PracticeCourseListAdapter;
@@ -75,18 +77,39 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
 
     @Override
     public void onClick(View view) {
-        switch (view.getId()) {
-            case R.id.tv_time:
-                //时间筛选
-                showTimeSelectPicker();
-                break;
-            case R.id.tv_course_status:
-                //课程状态筛选
-                initPopu(mViewBinding.tvCourseStatus);
-                break;
-            case R.id.tv_agency:
-                selectSubject();
-                break;
+        int id = view.getId();
+        if (id == R.id.tv_time) {
+            //时间筛选
+            showTimeSelectPicker();
+        } else if (id == R.id.tv_course_status) {
+            //课程状态筛选
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (CourseFilterStatusBean bean : mCourseFilterStatusBeans) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.showText);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                CourseFilterStatusBean bean = mCourseFilterStatusBeans.get(position);
+                mViewBinding.tvCourseStatus.setText(bean.showText);
+                reBuildFilter(currentSelectDate, bean.value);
+            });
+        } else if (id == R.id.tv_agency) {
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvAgency.setText(bean.name);
+                queryCourse(true);
+            });
         }
     }
 
@@ -147,12 +170,9 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
 
     @Override
     protected void initData() {
-        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
-            @Override
-            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
-                currentPage = 1;
-                queryCourse(true);
-            }
+        mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> {
+            currentPage = 1;
+            queryCourse(true);
         });
 
         mAdapter = new PracticeCourseListAdapter(R.layout.item_sparring_course_list_layout);
@@ -181,7 +201,6 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
         buildDefaultCourseStatusFilterList();
-        presenter.querySubjectItem();
     }
 
     private void queryCourse(boolean isShowLoading) {
@@ -248,7 +267,6 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
 
     private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
 
-    @Override
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
         subjectBeanList.clear();
         subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
@@ -267,29 +285,17 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
         if (pvTime == null) {
             pvTime = new TimePickerBuilder(requireContext(), (date, v) -> {//选中事件回调
                 reBuildFilter(date, currentCourseFilterStatus);
-            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout, new CustomListener() {
-                @Override
-                public void customLayout(View v) {
-                    //自定义布局中的控件初始化及事件处理
-                    final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
-                    TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
-                    tvSubmit.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            pvTime.returnData();
-                            pvTime.dismiss();
-                        }
-                    });
-                    ivCancel.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            pvTime.dismiss();
-                        }
-                    });
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_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 -> {
+                    pvTime.returnData();
+                    pvTime.dismiss();
+                });
+                ivCancel.setOnClickListener(v1 -> pvTime.dismiss());
 
-                }
-            })
-                    .setLineSpacingMultiplier(2.5f)
+            }).setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
                     .isDialog(false)//是否显示为对话框样式
@@ -304,47 +310,17 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
         }
     }
 
-    private void initPopu(View targetView) {
-        if (mPopupWindow == null) {
-            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
-            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
-            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
-            bg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mPopupWindow != null) {
-                        mPopupWindow.dismiss();
-                    }
-                }
-            });
-            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
-            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
-                @Override
-                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                    Object object = mCourseStatusFilterAdapter.getData().get(position);
-                    if (object instanceof CourseFilterStatusBean) {
-                        if (mCourseStatusFilterAdapter != null) {
-                            mCourseStatusFilterAdapter.setSelect(position);
-                        }
-                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
-                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
-                        reBuildFilter(currentSelectDate, filterStatusBean.value);
-                    }
-                    mPopupWindow.dismiss();
-                }
-            });
-            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
-            recyclerView.setAdapter(mCourseStatusFilterAdapter);
-            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
-            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
-        }
-        mPopupWindow.showAsDropDown(targetView);
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
     }
 
     private OptionsPickerView pvOptions;
 
     private void selectSubject() {
+        if (subjectBeanList.size() == 0) {
+            subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        }
         pvOptions = new OptionsPickerBuilder(getContext(), (options1, options2, options3, v) -> {
             currentSubjectId = subjectBeanList.get(options1).id;
             mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
@@ -353,12 +329,9 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
             //自定义布局中的控件初始化及事件处理
             final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
             TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
-            tvSubmit.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    pvOptions.returnData();
-                    pvOptions.dismiss();
-                }
+            tvSubmit.setOnClickListener(v12 -> {
+                pvOptions.returnData();
+                pvOptions.dismiss();
             });
             ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 

+ 46 - 63
student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java

@@ -23,6 +23,8 @@ import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.student.adapter.VideoCourseListAdapter;
@@ -48,10 +50,6 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
     private int currentPage;
     private VideoCourseListAdapter mAdapter;
     private EmptyViewLayout mEmptyView;
-    private TextView mTvEmptyTip;
-    private ImageView mEmptyIcon;
-    private PopupWindow mPopupWindow;
-    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
     private boolean hasNext = true;
     private boolean isFirstLoad = true;
     private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
@@ -93,14 +91,6 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         isFirstLoad = false;
     }
 
-    private void buildDefaultCourseStatusFilterList() {
-//        mCourseFilterStatusBeans = new ArrayList<>();
-//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_ALL, "全部"));
-//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_HAS_NOT_STARTED, "未开始"));
-//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_IN_PROGRESS, "进行中"));
-//        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_COMPLETED, "已结束"));
-    }
-
     private void reBuildFilter() {
         currentPage = 1;
         queryCourse(true);
@@ -109,23 +99,15 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
 
     @Override
     protected void initData() {
-        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
-            @Override
-            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
-                refresh();
-            }
-        });
+        mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> refresh());
 
         mAdapter = new VideoCourseListAdapter(R.layout.item_video_course_list_layout);
-        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
-            @Override
-            public void onLoadMore() {
-                //上拉加载
-                if (hasNext) {
-                    loadMore();
-                } else {
-                    mAdapter.getLoadMoreModule().loadMoreEnd();
-                }
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(() -> {
+            //上拉加载
+            if (hasNext) {
+                loadMore();
+            } else {
+                mAdapter.getLoadMoreModule().loadMoreEnd();
             }
         });
         mAdapter.getLoadMoreModule().setAutoLoadMore(true);
@@ -147,19 +129,13 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         mViewBinding.recyclerView.addItemDecoration(itemDecoration);
         mViewBinding.recyclerView.setLayoutManager(gridLayoutManager);
         mViewBinding.recyclerView.setAdapter(mAdapter);
-        buildDefaultCourseStatusFilterList();
-        reBuildFilter();
-        mAdapter.setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                SelectMyGroupBean.RowsBean item = (SelectMyGroupBean.RowsBean) adapter.getItem(position);
-                ARouter.getInstance()
-                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
-                        .withString(WebConstants.WEB_URL, WebConstants.TEACHER_VIDEO_DETAIL + "?groupId=" + item.id)
-                        .navigation();
-            }
+        mAdapter.setOnItemClickListener((adapter, view, position) -> {
+            SelectMyGroupBean.RowsBean item = (SelectMyGroupBean.RowsBean) adapter.getItem(position);
+            ARouter.getInstance()
+                    .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                    .withString(WebConstants.WEB_URL, WebConstants.TEACHER_VIDEO_DETAIL + "?groupId=" + item.id)
+                    .navigation();
         });
-        presenter.querySubjectItem();
     }
 
 
@@ -242,7 +218,6 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         }
     }
 
-    @Override
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
         subjectBeanList.clear();
         subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
@@ -261,39 +236,47 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
     @Override
     public void onClick(View v) {
         if (v.getId() == R.id.tv_subject) {
-            selectSubject();
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvSubject, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvSubject.setText(bean.name);
+                queryCourse(true);
+            });
         }
     }
 
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
+    }
+
     private void selectSubject() {
-        if(subjectBeanList.size() == 0){
-            return;
+        if (subjectBeanList.size() == 0) {
+            subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
         }
         pvOptions = new OptionsPickerBuilder(getContext(), (options1, options2, options3, v) -> {
             currentSubjectId = subjectBeanList.get(options1).id;
             mViewBinding.tvSubject.setText(subjectBeanList.get(options1).name);
             queryCourse(true);
-        }).setLayoutRes(R.layout.pickerview_address_layout, new CustomListener() {
-            @Override
-            public void customLayout(View v) {
-                //自定义布局中的控件初始化及事件处理
-                final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
-                TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
-                tvSubmit.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        pvOptions.returnData();
-                        pvOptions.dismiss();
-                    }
-                });
-                ivCancel.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        pvOptions.dismiss();
-                    }
-                });
+        }).setLayoutRes(R.layout.pickerview_address_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());
 
-            }
         }).isDialog(false)
                 .build();
         pvOptions.setPicker(subjectBeanList);

+ 8 - 1
teacher/src/main/java/com/cooleshow/teacher/api/APIService.java

@@ -22,6 +22,7 @@ import com.cooleshow.teacher.bean.PianoRoomCourseCommentBean;
 import com.cooleshow.teacher.bean.PianoRoomCourseHomeworkBean;
 import com.cooleshow.teacher.bean.PianoRoomCourseInfoBean;
 import com.cooleshow.teacher.bean.PianoRoomCourseListBean;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
 import com.cooleshow.teacher.bean.ReceivedCommentListBean;
 import com.cooleshow.teacher.bean.ResponseBankCardBean;
 import com.cooleshow.teacher.bean.ResponseBindCardBean;
@@ -103,7 +104,13 @@ public interface APIService {
      */
     @POST(TEACHER_GROUP + "courseSchedule/queryTeacherPracticeCourse")
     Observable<BaseResponse<SparringCourseListBean>> getSparringCourses(@Body RequestBody body);
-
+    /**
+     * 获取声部搜索下拉框
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "student/querySubjectItem")
+    Observable<BaseResponse<List<QuerySubjectBean>>> querySubjectItem();
 
     /**
      * 查询琴房课列表

+ 65 - 0
teacher/src/main/java/com/cooleshow/teacher/bean/QuerySubjectBean.java

@@ -0,0 +1,65 @@
+package com.cooleshow.teacher.bean;
+
+import com.contrarywind.interfaces.IPickerViewData;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/30 11:53
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class QuerySubjectBean implements IPickerViewData {
+    /*
+    	"code": "",
+			"createTime": "",
+			"delFlag": true,
+			"desc": "",
+			"id": 0,
+			"img": "",
+			"name": "",
+			"parentSubjectId": 0,
+			"parentSubjectName": "",
+			"subjects": [
+				{
+					"code": "",
+					"createTime": "",
+					"delFlag": true,
+					"desc": "",
+					"id": 0,
+					"img": "",
+					"name": "",
+					"parentSubjectId": 0,
+					"parentSubjectName": "",
+					"subjects": [
+						{}
+					],
+					"updateTime": ""
+				}
+			],
+			"updateTime": ""
+     */
+
+    public QuerySubjectBean(String name, int id) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public String code;
+    public String createTime;
+    public boolean delFlag;
+    public String desc;
+    public int id;
+    public String img;
+    public String name;
+    public int parentSubjectId;
+    public String parentSubjectName;
+    public List<QuerySubjectBean> subjects;
+    public String updateTime;
+
+    @Override
+    public String getPickerViewText() {
+        return name;
+    }
+}

+ 5 - 1
teacher/src/main/java/com/cooleshow/teacher/contract/MineCourseContract.java

@@ -1,6 +1,9 @@
 package com.cooleshow.teacher.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
+
+import java.util.List;
 
 /**
  * Author by pq, Date on 2022/4/20.
@@ -8,7 +11,8 @@ import com.cooleshow.base.presenter.view.BaseView;
 public interface MineCourseContract {
 
     interface MineCourseView extends BaseView {
-//        void onLoginResult(UserInfo userInfo);
+        void querySubjectItemSuccess(List<QuerySubjectBean> data);
+
     }
 
     interface Presenter {

+ 20 - 0
teacher/src/main/java/com/cooleshow/teacher/presenter/course/MineCoursePresenter.java

@@ -1,12 +1,32 @@
 package com.cooleshow.teacher.presenter.course;
 
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.teacher.api.APIService;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
 import com.cooleshow.teacher.contract.HomeContract;
 import com.cooleshow.teacher.contract.MineCourseContract;
 
+import java.util.List;
+
 /**
  * Author by pq, Date on 2022/4/20.
  */
 public class MineCoursePresenter extends BasePresenter<MineCourseContract.MineCourseView> implements MineCourseContract.Presenter {
+    public void querySubjectItem() {
+        addSubscribe(create(APIService.class).querySubjectItem(), new BaseObserver<List<QuerySubjectBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<QuerySubjectBean> data) {
+                if (getView() != null) {
+                    getView().querySubjectItemSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
 
+            }
+        });
+    }
 }

+ 47 - 44
teacher/src/main/java/com/cooleshow/teacher/ui/course/LiveCourseFragment.java

@@ -20,11 +20,14 @@ import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.teacher.adapter.LiveCourseListAdapter;
 import com.cooleshow.teacher.bean.CourseFilterStatusBean;
 import com.cooleshow.teacher.bean.LiveCourseListBean;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
 import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.LiveCourseContract;
 import com.cooleshow.teacher.databinding.FragmentLiveCourseLayoutBinding;
@@ -35,6 +38,7 @@ import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.LinearLayoutManager;
@@ -51,12 +55,9 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
     private int currentPage;
     private LiveCourseListAdapter mAdapter;
     private EmptyViewLayout mEmptyView;
-    private TextView mTvEmptyTip;
-    private ImageView mEmptyIcon;
     private TimePickerView pvTime;
-    private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
-    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
     private boolean hasNext = true;
     private boolean isFirstLoad = true;
 
@@ -74,6 +75,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
     protected void initView(View rootView) {
         mViewBinding.tvTime.setOnClickListener(this);
         mViewBinding.tvCourseStatus.setOnClickListener(this);
+        mViewBinding.tvAgency.setOnClickListener(this);
     }
 
     @Override
@@ -254,45 +256,6 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
             pvTime.show();
         }
     }
-
-    private void initPopu(View targetView) {
-        if (mPopupWindow == null) {
-            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
-            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
-            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
-            bg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mPopupWindow != null) {
-                        mPopupWindow.dismiss();
-                    }
-                }
-            });
-            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
-            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
-                @Override
-                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                    Object object = mCourseStatusFilterAdapter.getData().get(position);
-                    if (object instanceof CourseFilterStatusBean) {
-                        if (mCourseStatusFilterAdapter != null) {
-                            mCourseStatusFilterAdapter.setSelect(position);
-                        }
-                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
-                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
-                        reBuildFilter(currentSelectDate, filterStatusBean.value);
-                    }
-                    mPopupWindow.dismiss();
-                }
-            });
-            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
-            recyclerView.setAdapter(mCourseStatusFilterAdapter);
-            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
-            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
-        }
-        mPopupWindow.showAsDropDown(targetView);
-    }
-
     @Override
     public void onClick(View v) {
         if (v.getId() == R.id.tv_time) {
@@ -303,8 +266,48 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
 
         if (v.getId() == R.id.tv_course_status) {
             //课程状态筛选
-            initPopu(mViewBinding.tvCourseStatus);
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (CourseFilterStatusBean bean : mCourseFilterStatusBeans) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.showText);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                CourseFilterStatusBean bean = mCourseFilterStatusBeans.get(position);
+                mViewBinding.tvCourseStatus.setText(bean.showText);
+                reBuildFilter(currentSelectDate, bean.value);
+            });
+            return;
+        }
+        if (v.getId() == R.id.tv_agency) {
+            //选择声部
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvAgency, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvAgency.setText(bean.name);
+                queryCourse(true);
+            });
             return;
         }
     }
+
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
 }

+ 39 - 14
teacher/src/main/java/com/cooleshow/teacher/ui/course/MineCourseActivity.java

@@ -10,10 +10,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 java.util.ArrayList;
+import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -24,8 +29,12 @@ import androidx.viewpager2.widget.ViewPager2;
  * Author by pq, Date on 2022/4/25.
  */
 @Route(path = RouterPath.CourseCenter.TEACHER_MINE_COURSE)
-public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayoutBinding, MineCoursePresenter> {
+public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayoutBinding, MineCoursePresenter> implements MineCourseContract.MineCourseView {
     private ArrayList<Fragment> mFragments = new ArrayList<>();
+    private SparringCourseFragment mSparringCourseFragment;
+    private LiveCourseFragment mLiveCourseFragment;
+    private VideoCourseFragment mVideoCourseFragment;
+    private PianoRoomCourseFragment mPianoRoomCourseFragment;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -44,16 +53,16 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "我的课程");
         viewBinding.radioGroup.setOnCheckedChangeListener((radioGroup, i) -> {
                     if (i == R.id.rb_sparring) {
-                        viewBinding.viewPager.setCurrentItem(0,false);
+                        viewBinding.viewPager.setCurrentItem(0, false);
                     }
                     if (i == R.id.rb_live_course) {
-                        viewBinding.viewPager.setCurrentItem(1,false);
+                        viewBinding.viewPager.setCurrentItem(1, false);
                     }
                     if (i == R.id.rb_video_course) {
-                        viewBinding.viewPager.setCurrentItem(2,false);
+                        viewBinding.viewPager.setCurrentItem(2, false);
                     }
                     if (i == R.id.rb_piano_room_course) {
-                        viewBinding.viewPager.setCurrentItem(3,false);
+                        viewBinding.viewPager.setCurrentItem(3, false);
                     }
                 }
         );
@@ -102,23 +111,39 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
     @Override
     public void initData() {
         super.initData();
-        SparringCourseFragment sparringCourseFragment = new SparringCourseFragment();
-        LiveCourseFragment liveCourseFragment = new LiveCourseFragment();
-        VideoCourseFragment videoCourseFragment = new VideoCourseFragment();
-        PianoRoomCourseFragment pianoRoomCourseFragment = new PianoRoomCourseFragment();
-        mFragments.add(sparringCourseFragment);
-        mFragments.add(liveCourseFragment);
-        mFragments.add(videoCourseFragment);
-        mFragments.add(pianoRoomCourseFragment);
+        mSparringCourseFragment = new SparringCourseFragment();
+        mLiveCourseFragment = new LiveCourseFragment();
+        mVideoCourseFragment = new VideoCourseFragment();
+        mPianoRoomCourseFragment = new PianoRoomCourseFragment();
+        mFragments.add(mSparringCourseFragment);
+        mFragments.add(mLiveCourseFragment);
+        mFragments.add(mVideoCourseFragment);
+        mFragments.add(mPianoRoomCourseFragment);
         MineCoursePageAdapter mineCoursePageAdapter = new MineCoursePageAdapter(this);
         mineCoursePageAdapter.setFragments(mFragments);
         viewBinding.viewPager.setAdapter(mineCoursePageAdapter);
         viewBinding.viewPager.setOffscreenPageLimit(mFragments.size());
-
+        presenter.querySubjectItem();
     }
 
     @Override
     protected MineCoursePresenter createPresenter() {
         return new MineCoursePresenter();
     }
+
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        if (mSparringCourseFragment != null) {
+            mSparringCourseFragment.querySubjectItemSuccess(data);
+        }
+        if (mLiveCourseFragment != null) {
+            mLiveCourseFragment.querySubjectItemSuccess(data);
+        }
+        if (mVideoCourseFragment != null) {
+            mVideoCourseFragment.querySubjectItemSuccess(data);
+        }
+        if (mPianoRoomCourseFragment != null) {
+            mPianoRoomCourseFragment.querySubjectItemSuccess(data);
+        }
+    }
 }

+ 65 - 69
teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoRoomCourseFragment.java

@@ -22,12 +22,15 @@ import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.teacher.adapter.PianoRoomCourseListAdapter;
 import com.cooleshow.teacher.adapter.SparringCourseListAdapter;
 import com.cooleshow.teacher.bean.CourseFilterStatusBean;
 import com.cooleshow.teacher.bean.PianoRoomCourseListBean;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
 import com.cooleshow.teacher.bean.SparringCourseListBean;
 import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.PianoRoomCourseContract;
@@ -42,6 +45,7 @@ import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.LinearLayoutManager;
@@ -60,12 +64,9 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
     private boolean hasNext = true;
     private PianoRoomCourseListAdapter mAdapter;
     private EmptyViewLayout mEmptyView;
-    private TextView mTvEmptyTip;
-    private ImageView mEmptyIcon;
     private TimePickerView pvTime;
-    private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
-    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
     private boolean isFirstLoad = true;
 
     @Override
@@ -82,6 +83,7 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
     protected void initView(View rootView) {
         mViewBinding.tvTime.setOnClickListener(this);
         mViewBinding.tvCourseStatus.setOnClickListener(this);
+        mViewBinding.tvAgency.setOnClickListener(this);
     }
 
     @Override
@@ -125,37 +127,28 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
 
     @Override
     protected void initData() {
-        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
-            @Override
-            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
-                currentPage = 1;
-                queryCourse(true);
-            }
+        mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> {
+            currentPage = 1;
+            queryCourse(true);
         });
 
         mAdapter = new PianoRoomCourseListAdapter(R.layout.item_piano_room_course_list_layout);
-        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
-            @Override
-            public void onLoadMore() {
-                //上拉加载
-                if (hasNext) {
-                    currentPage++;
-                    queryCourse(false);
-                } else {
-                    mAdapter.getLoadMoreModule().loadMoreEnd();
-                }
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(() -> {
+            //上拉加载
+            if (hasNext) {
+                currentPage++;
+                queryCourse(false);
+            } else {
+                mAdapter.getLoadMoreModule().loadMoreEnd();
             }
         });
-        mAdapter.setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                if (position < mAdapter.getData().size()) {
-                    PianoRoomCourseListBean.RowsBean rowsBean = mAdapter.getData().get(position);
-                    if (rowsBean != null) {
-                        ARouter.getInstance().build(RouterPath.CourseCenter.PIANO_ROOM_COURSE_DETAIL)
-                                .withString("course_id", rowsBean.courseId)
-                                .navigation();
-                    }
+        mAdapter.setOnItemClickListener((adapter, view, position) -> {
+            if (position < mAdapter.getData().size()) {
+                PianoRoomCourseListBean.RowsBean rowsBean = mAdapter.getData().get(position);
+                if (rowsBean != null) {
+                    ARouter.getInstance().build(RouterPath.CourseCenter.PIANO_ROOM_COURSE_DETAIL)
+                            .withString("course_id", rowsBean.courseId)
+                            .navigation();
                 }
             }
         });
@@ -276,44 +269,6 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
         }
     }
 
-    private void initPopu(View targetView) {
-        if (mPopupWindow == null) {
-            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
-            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
-            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
-            bg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mPopupWindow != null) {
-                        mPopupWindow.dismiss();
-                    }
-                }
-            });
-            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
-            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
-                @Override
-                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                    Object object = mCourseStatusFilterAdapter.getData().get(position);
-                    if (object instanceof CourseFilterStatusBean) {
-                        if (mCourseStatusFilterAdapter != null) {
-                            mCourseStatusFilterAdapter.setSelect(position);
-                        }
-                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
-                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
-                        reBuildFilter(currentSelectDate, filterStatusBean.value);
-                    }
-                    mPopupWindow.dismiss();
-                }
-            });
-            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
-            recyclerView.setAdapter(mCourseStatusFilterAdapter);
-            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
-            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
-        }
-        mPopupWindow.showAsDropDown(targetView);
-    }
-
     @Override
     public void onClick(View v) {
         if (v.getId() == R.id.tv_time) {
@@ -321,10 +276,51 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
             showTimeSelectPicker();
             return;
         }
+
         if (v.getId() == R.id.tv_course_status) {
             //课程状态筛选
-            initPopu(mViewBinding.tvCourseStatus);
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (CourseFilterStatusBean bean : mCourseFilterStatusBeans) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.showText);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                CourseFilterStatusBean bean = mCourseFilterStatusBeans.get(position);
+                mViewBinding.tvCourseStatus.setText(bean.showText);
+                reBuildFilter(currentSelectDate, bean.value);
+            });
             return;
         }
+        if (v.getId() == R.id.tv_agency) {
+            //选择声部
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvAgency, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvAgency.setText(bean.name);
+                queryCourse(true);
+            });
+            return;
+        }
+    }
+
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
     }
 }

+ 79 - 94
teacher/src/main/java/com/cooleshow/teacher/ui/course/SparringCourseFragment.java

@@ -22,10 +22,13 @@ import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.TimeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.teacher.adapter.SparringCourseListAdapter;
 import com.cooleshow.teacher.bean.CourseFilterStatusBean;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
 import com.cooleshow.teacher.bean.SparringCourseListBean;
 import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.SparringCourseContract;
@@ -37,6 +40,7 @@ import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.LinearLayoutManager;
@@ -54,13 +58,11 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
     private boolean hasNext = true;
     private SparringCourseListAdapter mAdapter;
     private EmptyViewLayout mEmptyView;
-    private TextView mTvEmptyTip;
-    private ImageView mEmptyIcon;
     private TimePickerView pvTime;
-    private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
-    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
     private boolean isFirstLoad = true;
+
     @Override
     protected FragmentSparringCourseLayoutBinding getLayoutView() {
         return FragmentSparringCourseLayoutBinding.inflate(getLayoutInflater());
@@ -75,19 +77,20 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
     protected void initView(View rootView) {
         mViewBinding.tvTime.setOnClickListener(this);
         mViewBinding.tvCourseStatus.setOnClickListener(this);
+        mViewBinding.tvAgency.setOnClickListener(this);
     }
 
     @Override
     public void refreshData() {
         super.refreshData();
-        reBuildFilter(currentSelectDate,currentCourseFilterStatus);
+        reBuildFilter(currentSelectDate, currentCourseFilterStatus);
         isFirstLoad = false;
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        if(isFirstLoad){
+        if (isFirstLoad) {
             isFirstLoad = false;
             reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
         }
@@ -118,40 +121,31 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
 
     @Override
     protected void initData() {
-        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
-            @Override
-            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
-                currentPage = 1;
-                queryCourse(true);
-            }
+        mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> {
+            currentPage = 1;
+            queryCourse(true);
         });
 
         mAdapter = new SparringCourseListAdapter(R.layout.item_sparring_course_list_layout);
-        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
-            @Override
-            public void onLoadMore() {
-                //上拉加载
-                if (hasNext) {
-                    currentPage++;
-                    queryCourse(false);
-                } else {
-                    mAdapter.getLoadMoreModule().loadMoreEnd();
-                }
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(() -> {
+            //上拉加载
+            if (hasNext) {
+                currentPage++;
+                queryCourse(false);
+            } else {
+                mAdapter.getLoadMoreModule().loadMoreEnd();
             }
         });
-        mAdapter.setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                if (position < mAdapter.getData().size()) {
-                    SparringCourseListBean.RowsBean rowsBean = mAdapter.getData().get(position);
-                    if (rowsBean != null) {
-                        ARouter.getInstance()
-                                .build(RouterPath.CourseCenter.SPARRING_COURSE_DETAIL)
-                                .withString(SparringCourseDetailActivity.COURSE_ID, rowsBean.courseId)
-                                .withString(SparringCourseDetailActivity.COURSE_GROUP_ID, rowsBean.courseGoupId)
-                                .withString(SparringCourseDetailActivity.STUDENT_ID, rowsBean.userId)
-                                .navigation();
-                    }
+        mAdapter.setOnItemClickListener((adapter, view, position) -> {
+            if (position < mAdapter.getData().size()) {
+                SparringCourseListBean.RowsBean rowsBean = mAdapter.getData().get(position);
+                if (rowsBean != null) {
+                    ARouter.getInstance()
+                            .build(RouterPath.CourseCenter.SPARRING_COURSE_DETAIL)
+                            .withString(SparringCourseDetailActivity.COURSE_ID, rowsBean.courseId)
+                            .withString(SparringCourseDetailActivity.COURSE_GROUP_ID, rowsBean.courseGoupId)
+                            .withString(SparringCourseDetailActivity.STUDENT_ID, rowsBean.userId)
+                            .navigation();
                 }
             }
         });
@@ -235,27 +229,16 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
         if (pvTime == null) {
             pvTime = new TimePickerBuilder(requireContext(), (date, v) -> {//选中事件回调
                 reBuildFilter(date, currentCourseFilterStatus);
-            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout, new CustomListener() {
-                @Override
-                public void customLayout(View v) {
-                    //自定义布局中的控件初始化及事件处理
-                    final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
-                    TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
-                    tvSubmit.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            pvTime.returnData();
-                            pvTime.dismiss();
-                        }
-                    });
-                    ivCancel.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            pvTime.dismiss();
-                        }
-                    });
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_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(v1 -> {
+                    pvTime.returnData();
+                    pvTime.dismiss();
+                });
+                ivCancel.setOnClickListener(v12 -> pvTime.dismiss());
 
-                }
             })
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
@@ -272,44 +255,6 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
         }
     }
 
-    private void initPopu(View targetView) {
-        if (mPopupWindow == null) {
-            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
-            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
-            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
-            bg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mPopupWindow != null) {
-                        mPopupWindow.dismiss();
-                    }
-                }
-            });
-            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
-            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
-                @Override
-                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                    Object object = mCourseStatusFilterAdapter.getData().get(position);
-                    if (object instanceof CourseFilterStatusBean) {
-                        if (mCourseStatusFilterAdapter != null) {
-                            mCourseStatusFilterAdapter.setSelect(position);
-                        }
-                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
-                        mViewBinding.tvCourseStatus.setText(filterStatusBean.showText);
-                        reBuildFilter(currentSelectDate, filterStatusBean.value);
-                    }
-                    mPopupWindow.dismiss();
-                }
-            });
-            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
-            recyclerView.setAdapter(mCourseStatusFilterAdapter);
-            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
-            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
-        }
-        mPopupWindow.showAsDropDown(targetView);
-    }
-
     @Override
     public void onClick(View v) {
         if (v.getId() == R.id.tv_time) {
@@ -319,8 +264,48 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
         }
         if (v.getId() == R.id.tv_course_status) {
             //课程状态筛选
-            initPopu(mViewBinding.tvCourseStatus);
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (CourseFilterStatusBean bean : mCourseFilterStatusBeans) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.showText);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvCourseStatus, popList, position -> {
+                CourseFilterStatusBean bean = mCourseFilterStatusBeans.get(position);
+                mViewBinding.tvCourseStatus.setText(bean.showText);
+                reBuildFilter(currentSelectDate, bean.value);
+            });
+            return;
+        }
+        if (v.getId() == R.id.tv_agency) {
+            //选择声部
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvAgency, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvAgency.setText(bean.name);
+                queryCourse(true);
+            });
             return;
         }
     }
+
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
 }

+ 35 - 45
teacher/src/main/java/com/cooleshow/teacher/ui/course/VideoCourseFragment.java

@@ -19,10 +19,13 @@ import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PopupUtil;
 import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.cooleshow.base.widgets.poplist.PopMenuBean;
+import com.cooleshow.base.widgets.poplist.PopupListWindow;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.teacher.adapter.VideoCourseListAdapter;
 import com.cooleshow.teacher.bean.CourseFilterStatusBean;
+import com.cooleshow.teacher.bean.QuerySubjectBean;
 import com.cooleshow.teacher.bean.VideoCourseListBean;
 import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.VideoCourseContract;
@@ -37,6 +40,9 @@ import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Author by pq, Date on 2022/4/25.
  */
@@ -45,10 +51,7 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
     private int currentPage;
     private VideoCourseListAdapter mAdapter;
     private EmptyViewLayout mEmptyView;
-    private TextView mTvEmptyTip;
-    private ImageView mEmptyIcon;
-    private PopupWindow mPopupWindow;
-    private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
     private boolean hasNext = true;
     private boolean isFirstLoad = true;
 
@@ -238,51 +241,38 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         mAdapter.setEmptyView(mEmptyView);
     }
 
-
-    private void initPopu(View targetView) {
-        if (mPopupWindow == null) {
-            View popupContentView = LayoutInflater.from(requireContext()).inflate(com.cooleshow.base.R.layout.list_popu_layout, null);
-            RecyclerView recyclerView = popupContentView.findViewById(R.id.recyclerView);
-            View bg = popupContentView.findViewById(com.cooleshow.base.R.id.view);
-            bg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mPopupWindow != null) {
-                        mPopupWindow.dismiss();
-                    }
-                }
-            });
-            mCourseStatusFilterAdapter = new CourseStatusFilterAdapter(com.cooleshow.base.R.layout.notice_popu_list_item);
-            mCourseStatusFilterAdapter.setOnItemClickListener(new OnItemClickListener() {
-                @Override
-                public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
-                    Object object = mCourseStatusFilterAdapter.getData().get(position);
-                    if (object instanceof CourseFilterStatusBean) {
-                        if (mCourseStatusFilterAdapter != null) {
-                            mCourseStatusFilterAdapter.setSelect(position);
-                        }
-                        CourseFilterStatusBean filterStatusBean = (CourseFilterStatusBean) object;
-                        mViewBinding.tvSubject.setText(filterStatusBean.showText);
-                        reBuildFilter();
-                    }
-                    mPopupWindow.dismiss();
-                }
-            });
-            recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
-            recyclerView.setAdapter(mCourseStatusFilterAdapter);
-//            mCourseStatusFilterAdapter.setNewInstance(mCourseFilterStatusBeans);
-            mPopupWindow = PopupUtil.createNoBackPopupWindow(popupContentView, requireContext(), ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, true);
-        }
-        mPopupWindow.showAsDropDown(targetView);
-    }
-
     @Override
     public void onClick(View v) {
-        if (v.getId() == R.id.tv_course_status) {
+        if (v.getId() == R.id.tv_subject) {
             //课程状态筛选
-            initPopu(mViewBinding.tvSubject);
+            //选择声部
+            if (subjectBeanList.size() == 0) {
+                subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+            }
+            List<PopMenuBean> popList = new ArrayList<>();
+            for (QuerySubjectBean bean : subjectBeanList) {
+                PopMenuBean popMenuBean = new PopMenuBean();
+                popMenuBean.setActionName(bean.name);
+                popList.add(popMenuBean);
+            }
+            initCoursePop(mViewBinding.tvSubject, popList, position -> {
+                QuerySubjectBean bean = subjectBeanList.get(position);
+                currentSubjectId = bean.id;
+                mViewBinding.tvSubject.setText(bean.name);
+                queryCourse(true);
+            });
             return;
         }
     }
+
+    private void initCoursePop(View targetView, List<PopMenuBean> popList, PopupListWindow.PopupListListener listener) {
+        PopupListWindow popWindow = new PopupListWindow(getContext());
+        popWindow.showListPop(targetView, popList, position -> listener.onPopupListClick(position));
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
 }

+ 9 - 5
teacher/src/main/res/layout/fragment_live_course_layout.xml

@@ -11,7 +11,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="25dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:paddingTop="18dp"
@@ -29,7 +29,9 @@
         android:layout_width="wrap_content"
         android:layout_height="0dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
+        android:paddingTop="18dp"
+        android:paddingBottom="12dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:textColor="@color/color_666666"
@@ -45,14 +47,16 @@
         android:id="@+id/tv_agency"
         android:layout_width="wrap_content"
         android:layout_height="0dp"
-        android:layout_marginEnd="25dp"
+        android:layout_marginEnd="23dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
+        android:paddingTop="18dp"
+        android:paddingBottom="12dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:textColor="@color/color_666666"
         android:textSize="@dimen/sp_13"
-        android:text="声部"
+        android:text="全部声部"
         app:layout_constraintBottom_toBottomOf="@+id/tv_time"
         app:layout_constraintLeft_toRightOf="@+id/tv_course_status"
         app:layout_constraintRight_toRightOf="parent"

+ 9 - 5
teacher/src/main/res/layout/fragment_piano_room_course_layout.xml

@@ -11,7 +11,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="25dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:paddingTop="18dp"
@@ -29,7 +29,9 @@
         android:layout_width="wrap_content"
         android:layout_height="0dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
+        android:paddingTop="18dp"
+        android:paddingBottom="12dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:textColor="@color/color_666666"
@@ -45,14 +47,16 @@
         android:id="@+id/tv_agency"
         android:layout_width="wrap_content"
         android:layout_height="0dp"
-        android:layout_marginEnd="25dp"
+        android:layout_marginEnd="23dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
+        android:paddingTop="18dp"
+        android:paddingBottom="12dp"
         android:includeFontPadding="false"
         android:textColor="@color/color_666666"
         android:textSize="@dimen/sp_13"
-        android:text="声部"
+        android:text="全部声部"
         app:layout_constraintBottom_toBottomOf="@+id/tv_time"
         app:layout_constraintLeft_toRightOf="@+id/tv_course_status"
         app:layout_constraintRight_toRightOf="parent"

+ 11 - 7
teacher/src/main/res/layout/fragment_sparring_course_layout.xml

@@ -11,7 +11,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="25dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:paddingTop="18dp"
@@ -27,14 +27,16 @@
     <TextView
         android:id="@+id/tv_course_status"
         android:layout_width="wrap_content"
-        android:layout_height="0dp"
+        android:layout_height="wrap_content"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
+        android:paddingTop="@dimen/dp_18"
+        android:paddingBottom="@dimen/dp_12"
+        android:text="课程状态"
         android:textColor="@color/color_666666"
         android:textSize="@dimen/sp_13"
-        android:text="课程状态"
         app:layout_constraintBottom_toBottomOf="@+id/tv_time"
         app:layout_constraintLeft_toRightOf="@+id/tv_time"
         app:layout_constraintRight_toLeftOf="@+id/tv_agency"
@@ -45,14 +47,16 @@
         android:id="@+id/tv_agency"
         android:layout_width="wrap_content"
         android:layout_height="0dp"
-        android:layout_marginEnd="25dp"
+        android:layout_marginEnd="23dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
+        android:paddingTop="@dimen/dp_18"
+        android:paddingBottom="@dimen/dp_12"
+        android:text="全部声部"
         android:textColor="@color/color_666666"
         android:textSize="@dimen/sp_13"
-        android:text="声部"
         app:layout_constraintBottom_toBottomOf="@+id/tv_time"
         app:layout_constraintLeft_toRightOf="@+id/tv_course_status"
         app:layout_constraintRight_toRightOf="parent"

+ 2 - 1
teacher/src/main/res/layout/fragment_video_course_layout.xml

@@ -13,10 +13,11 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="25dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
         android:paddingTop="18dp"
+        android:paddingBottom="@dimen/dp_12"
         android:textColor="@color/color_666666"
         android:textSize="@dimen/sp_13"
         android:text="全部声部"