فهرست منبع

老师端和学生端 我的课程bug 修改 添加声部选择,页面滑动问题处理

邓琴文 3 سال پیش
والد
کامیت
69524356b3
17فایلهای تغییر یافته به همراه374 افزوده شده و 160 حذف شده
  1. 7 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/fragment/BaseMVPFragment.java
  2. 17 39
      student/src/main/java/com/cooleshow/student/adapter/MineCoursePagerAdapter.java
  3. 6 0
      student/src/main/java/com/cooleshow/student/contract/VideoCourseContract.java
  4. 20 0
      student/src/main/java/com/cooleshow/student/presenter/course/VideoCoursePresenter.java
  5. 18 11
      student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java
  6. 40 8
      student/src/main/java/com/cooleshow/student/ui/course/MineCourseActivity.java
  7. 73 77
      student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java
  8. 77 1
      student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java
  9. 2 1
      student/src/main/res/layout/activity_mine_course.xml
  10. 12 8
      student/src/main/res/layout/fragment_live_course_layout.xml
  11. 10 6
      student/src/main/res/layout/fragment_practice_course_layout.xml
  12. 20 4
      student/src/main/res/layout/fragment_video_course_layout.xml
  13. 15 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/LiveCourseFragment.java
  14. 5 0
      teacher/src/main/java/com/cooleshow/teacher/ui/course/MineCourseActivity.java
  15. 17 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoRoomCourseFragment.java
  16. 17 2
      teacher/src/main/java/com/cooleshow/teacher/ui/course/SparringCourseFragment.java
  17. 18 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/VideoCourseFragment.java

+ 7 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/fragment/BaseMVPFragment.java

@@ -42,6 +42,8 @@ public abstract class BaseMVPFragment<V extends ViewBinding,P extends BasePresen
         }
     }
 
+    public void refreshData(){}
+
     protected abstract P createPresenter();
 
     protected abstract void initView(View rootView);
@@ -61,4 +63,9 @@ public abstract class BaseMVPFragment<V extends ViewBinding,P extends BasePresen
             presenter = null;
         }
     }
+
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        super.setUserVisibleHint(isVisibleToUser);
+    }
 }

+ 17 - 39
student/src/main/java/com/cooleshow/student/adapter/MineCoursePagerAdapter.java

@@ -1,60 +1,38 @@
 package com.cooleshow.student.adapter;
 
-import android.view.ViewGroup;
+import java.util.ArrayList;
+import java.util.List;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
 
-import java.util.List;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 
 /**
- * 创建日期:2022/5/30 11:14
- *
- * @author Ryan
- * 类说明:
+ * Author by pq, Date on 2022/4/20.
  */
-public class MineCoursePagerAdapter extends FragmentPagerAdapter {
-
-    private List<String> titles;
-    public FragmentManager fm;
-    private List<Fragment> fragments;
-
-    public MineCoursePagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) {
-        super(fm);
-        this.fm=fm;
-        this.titles = titles;
-        this.fragments = fragments;
-    }
+public class MineCoursePagerAdapter extends FragmentStateAdapter {
+    private List<BaseMVPFragment> mFragments;
 
-    @Override
-    public Fragment getItem(int position) {
-        return fragments != null && fragments.size() > position ? fragments.get(position) : null;
+    public void setFragments(List<BaseMVPFragment> fragments) {
+        this.mFragments = fragments;
     }
 
-    @Override
-    public int getCount() {
-        return fragments == null ? 0 : fragments.size();
-    }
-
-    @Override
-    public CharSequence getPageTitle(int position) {
-        return titles != null && titles.size() > position ? titles.get(position) : "";
+    public MineCoursePagerAdapter(@NonNull FragmentActivity fragmentActivity) {
+        super(fragmentActivity);
     }
 
+    @NonNull
     @Override
-    public Fragment instantiateItem(ViewGroup container, int position) {
-        Fragment fragment = (Fragment) super.instantiateItem(container,
-                position);
-        fm.beginTransaction().show(fragment).commit();
+    public Fragment createFragment(int position) {
+        Fragment fragment = mFragments.get(position);
         return fragment;
     }
 
     @Override
-    public void destroyItem(ViewGroup container, int position, Object object) {
-        // super.destroyItem(container, position, object);
-        Fragment fragment = fragments.get(position);
-        fm.beginTransaction().hide(fragment).commit();
+    public int getItemCount() {
+        return mFragments != null ? mFragments.size() : 0;
     }
 }

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

@@ -1,9 +1,12 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.QuerySubjectBean;
 import com.cooleshow.student.bean.SelectMyGroupBean;
 import com.cooleshow.student.bean.VideoCourseListBean;
 
+import java.util.List;
+
 /**
  * Author by pq, Date on 2022/4/20.
  */
@@ -13,6 +16,9 @@ public interface VideoCourseContract {
         void onGetVideoCourseSuccess(int page, SelectMyGroupBean liveCourseListBean);
 
         void onGetCourseError(int page);
+
+        void querySubjectItemSuccess(List<QuerySubjectBean> data);
+
     }
 
     interface Presenter {

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

@@ -5,6 +5,7 @@ import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
 import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.QuerySubjectBean;
 import com.cooleshow.student.bean.SelectMyGroupBean;
 import com.cooleshow.student.bean.VideoCourseListBean;
 import com.cooleshow.student.contract.VideoCourseContract;
@@ -12,6 +13,8 @@ import com.cooleshow.student.contract.VideoCourseContract;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.List;
+
 /**
  * 陪练课presenter
  * Author by pq, Date on 2022/4/20.
@@ -52,4 +55,21 @@ 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);
+
+            }
+        });
+    }
 }

+ 18 - 11
student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java

@@ -67,6 +67,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
     private boolean hasNext = true;
+    private boolean isFirstLoad = true;
 
     public static LiveCourseFragment newInstance() {
         LiveCourseFragment fragment = new LiveCourseFragment();
@@ -88,7 +89,21 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         mViewBinding.tvCourseStatus.setOnClickListener(this);
         mViewBinding.tvAgency.setOnClickListener(this);
     }
+    @Override
+    public void onResume() {
+        super.onResume();
+        if(isFirstLoad){
+            isFirstLoad = false;
+            reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        }
+    }
 
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter(currentSelectDate, currentCourseFilterStatus);
+        isFirstLoad = false;
+    }
     private void buildDefaultCourseStatusFilterList() {
         mCourseFilterStatusBeans = new ArrayList<>();
         mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
@@ -137,10 +152,8 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         });
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
-
-        buildDefaultCourseStatusFilterList();
-        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
         presenter.querySubjectItem();
+        buildDefaultCourseStatusFilterList();
         mAdapter.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
@@ -242,16 +255,10 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
                             pvTime.dismiss();
                         }
                     });
-                    ivCancel.setOnClickListener(new View.OnClickListener() {
-                        @Override
-                        public void onClick(View v) {
-                            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)//是否显示为对话框样式

+ 40 - 8
student/src/main/java/com/cooleshow/student/ui/course/MineCourseActivity.java

@@ -1,18 +1,21 @@
 package com.cooleshow.student.ui.course;
 
+import android.graphics.Typeface;
 import android.os.Bundle;
 
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
-import androidx.viewpager.widget.ViewPager;
+import androidx.viewpager2.widget.ViewPager2;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 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.databinding.ActivityMineCourseBinding;
 import com.cooleshow.student.presenter.course.MineCoursePresenter;
 import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -31,7 +34,7 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBindin
 
 
     private TabLayout tabLayout;
-    private ViewPager viewPager;
+    private ViewPager2 viewPager;
     @Override
     protected void initView() {
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "我的课程");
@@ -61,18 +64,47 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseBindin
     }
 
     private List<String> titles = new ArrayList<String>(Arrays.asList("陪练课", "直播课", "视频课"));
-    private List<Fragment> fragments = new ArrayList<>();
+    private List<BaseMVPFragment> fragments = new ArrayList<>();
 
     private void initTabLayoutAndViewPager() {
-        tabLayout.removeAllTabs();
-        fragments.clear();
         fragments.add(MinePracticeCourseFragment.newInstance());
         fragments.add(LiveCourseFragment.newInstance());
         fragments.add(VideoCourseFragment.newInstance());
-        viewPager.setAdapter(new MineCoursePagerAdapter(getSupportFragmentManager(), fragments, titles));
-        tabLayout.setupWithViewPager(viewPager);
+        MineCoursePagerAdapter mineCoursePageAdapter = new MineCoursePagerAdapter(this);
+        mineCoursePageAdapter.setFragments(fragments);
+        viewPager.setAdapter(mineCoursePageAdapter);
+        new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
+            //这里需要根据position修改tab的样式和文字等
+            tab.setText(titles.get(position));
+            tab.select();
+        }).attach();
+        viewPager.setOffscreenPageLimit(fragments.size());
 
-    }
+        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                viewPager.setCurrentItem(tab.getPosition());
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+
+            }
 
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+
+            }
+        });
+
+        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                super.onPageSelected(position);
+                BaseMVPFragment fragment = fragments.get(position);
+                fragment.refreshData();
+            }
+        });
+    }
 
 }

+ 73 - 77
student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java

@@ -65,6 +65,7 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
     private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private boolean isFirstLoad = true;
 
 
     public static MinePracticeCourseFragment newInstance() {
@@ -101,12 +102,27 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
 
     @Override
     protected void initView(View rootView) {
-
         mViewBinding.tvTime.setOnClickListener(this);
         mViewBinding.tvCourseStatus.setOnClickListener(this);
         mViewBinding.tvAgency.setOnClickListener(this);
     }
 
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (isFirstLoad) {
+            isFirstLoad = false;
+            reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        }
+    }
+
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter(currentSelectDate, currentCourseFilterStatus);
+        isFirstLoad = false;
+    }
+
     private void buildDefaultCourseStatusFilterList() {
         mCourseFilterStatusBeans = new ArrayList<>();
         mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
@@ -140,38 +156,31 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
         });
 
         mAdapter = new PracticeCourseListAdapter(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()) {
-                    PracticeCourseListBean.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()) {
+                PracticeCourseListBean.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();
                 }
             }
         });
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
         buildDefaultCourseStatusFilterList();
-        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
         presenter.querySubjectItem();
     }
 
@@ -242,7 +251,7 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
     @Override
     public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
         subjectBeanList.clear();
-        subjectBeanList.add(new QuerySubjectBean("全部声部",0));
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
         subjectBeanList.addAll(data);
     }
 
@@ -259,27 +268,27 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
             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 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();
-                                }
-                            });
-
+                        public void onClick(View v) {
+                            pvTime.returnData();
+                            pvTime.dismiss();
                         }
-                    })
+                    });
+                    ivCancel.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            pvTime.dismiss();
+                        }
+                    });
+
+                }
+            })
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -332,41 +341,28 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
         }
         mPopupWindow.showAsDropDown(targetView);
     }
+
     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();
-                            }
-                        });
+    private void selectSubject() {
+        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(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    pvOptions.returnData();
+                    pvOptions.dismiss();
+                }
+            });
+            ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-                    }
-                })
-                .isDialog(false)
-                .build();
+        }).isDialog(false).build();
         pvOptions.setPicker(subjectBeanList);
         pvOptions.show();
 

+ 77 - 1
student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java

@@ -9,6 +9,10 @@ import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.GridLayoutManager;
 
 import com.alibaba.android.arouter.launcher.ARouter;
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.listener.OnItemClickListener;
 import com.chad.library.adapter.base.listener.OnLoadMoreListener;
@@ -22,7 +26,9 @@ import com.cooleshow.base.widgets.EmptyViewLayout;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.student.adapter.VideoCourseListAdapter;
+import com.cooleshow.student.bean.QuerySubjectBean;
 import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.constants.CourseConstants;
 import com.cooleshow.student.contract.VideoCourseContract;
 import com.cooleshow.student.databinding.FragmentVideoCourseLayoutBinding;
 import com.cooleshow.student.presenter.course.VideoCoursePresenter;
@@ -31,6 +37,9 @@ import com.cooleshow.usercenter.helper.UserHelper;
 import com.scwang.smart.refresh.layout.api.RefreshLayout;
 import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Author by pq, Date on 2022/4/25.
  */
@@ -44,10 +53,15 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
     private PopupWindow mPopupWindow;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
     private boolean hasNext = true;
+    private boolean isFirstLoad = true;
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+    private OptionsPickerView pvOptions;
+
     public static VideoCourseFragment newInstance() {
         VideoCourseFragment fragment = new VideoCourseFragment();
         return fragment;
     }
+
     @Override
     protected FragmentVideoCourseLayoutBinding getLayoutView() {
         return FragmentVideoCourseLayoutBinding.inflate(getLayoutInflater());
@@ -60,6 +74,23 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
 
     @Override
     protected void initView(View rootView) {
+        mViewBinding.tvSubject.setOnClickListener(this);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (isFirstLoad) {
+            isFirstLoad = false;
+            reBuildFilter();
+        }
+    }
+
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter();
+        isFirstLoad = false;
     }
 
     private void buildDefaultCourseStatusFilterList() {
@@ -128,6 +159,7 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
                         .navigation();
             }
         });
+        presenter.querySubjectItem();
     }
 
 
@@ -151,7 +183,7 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         //根据默认筛选条件查询
         LogUtils.i("pq", "currentSubjectId:" + currentSubjectId);
         LogUtils.i("pq", "currentPage:" + currentPage);
-        presenter.queryVideoCourse(isShowLoading,UserHelper.getUserId(), currentSubjectId, currentPage);
+        presenter.queryVideoCourse(isShowLoading, UserHelper.getUserId(), currentSubjectId, currentPage);
     }
 
     private void checkHasNext(int dataSize) {
@@ -210,6 +242,13 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         }
     }
 
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
+
     private void showEmptyView() {
         if (mEmptyView == null) {
             mEmptyView = new EmptyViewLayout(getContext());
@@ -221,6 +260,43 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
 
     @Override
     public void onClick(View v) {
+        if (v.getId() == R.id.tv_subject) {
+            selectSubject();
+        }
+    }
 
+    private void selectSubject() {
+        if(subjectBeanList.size() == 0){
+            return;
+        }
+        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();
+                    }
+                });
+
+            }
+        }).isDialog(false)
+                .build();
+        pvOptions.setPicker(subjectBeanList);
+        pvOptions.show();
     }
 }

+ 2 - 1
student/src/main/res/layout/activity_mine_course.xml

@@ -29,9 +29,10 @@
 
 
 
-    <androidx.viewpager.widget.ViewPager
+    <androidx.viewpager2.widget.ViewPager2
         android:id="@+id/viewpager"
         android:layout_width="match_parent"
+        android:overScrollMode="never"
         android:layout_height="0dp"
         android:layout_weight="1" />
 </LinearLayout>

+ 12 - 8
student/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"
@@ -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="18dp"
+        android:paddingBottom="12dp"
+        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"
@@ -44,15 +46,17 @@
     <TextView
         android:id="@+id/tv_agency"
         android:layout_width="wrap_content"
-        android:layout_height="0dp"
-        android:layout_marginEnd="25dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="23dp"
         android:drawableRight="@drawable/icon_arrow_down"
-        android:drawablePadding="4dp"
+        android:drawablePadding="6dp"
         android:gravity="center"
         android:includeFontPadding="false"
+        android:paddingTop="18dp"
+        android:paddingBottom="12dp"
+        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"

+ 10 - 6
student/src/main/res/layout/fragment_practice_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,10 +27,12 @@
     <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:paddingTop="18dp"
+        android:paddingBottom="12dp"
         android:includeFontPadding="false"
         android:textColor="@color/color_666666"
         android:textSize="@dimen/sp_13"
@@ -44,11 +46,13 @@
     <TextView
         android:id="@+id/tv_agency"
         android:layout_width="wrap_content"
-        android:layout_height="0dp"
-        android:layout_marginEnd="25dp"
+        android:layout_height="wrap_content"
+        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"

+ 20 - 4
student/src/main/res/layout/fragment_video_course_layout.xml

@@ -1,13 +1,29 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:ignore="MissingDefaultResource">
 
-
+    <TextView
+        android:id="@+id/tv_subject"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="25dp"
+        android:drawableRight="@drawable/icon_arrow_down"
+        android:drawablePadding="4dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:paddingTop="18dp"
+        android:paddingBottom="@dimen/dp_12"
+        android:text="全部声部"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_13"
+        app:layout_constraintHorizontal_chainStyle="spread_inside"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:text="全部声部" />
 
     <com.scwang.smart.refresh.layout.SmartRefreshLayout
         android:id="@+id/refreshLayout"
@@ -16,7 +32,7 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
+        app:layout_constraintTop_toBottomOf="@+id/tv_subject">
 
         <com.scwang.smart.refresh.header.ClassicsHeader
             android:layout_width="match_parent"

+ 15 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/LiveCourseFragment.java

@@ -58,6 +58,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
     private boolean hasNext = true;
+    private boolean isFirstLoad = true;
 
     @Override
     protected FragmentLiveCourseLayoutBinding getLayoutView() {
@@ -75,6 +76,20 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         mViewBinding.tvCourseStatus.setOnClickListener(this);
     }
 
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter(currentSelectDate,currentCourseFilterStatus);
+        isFirstLoad = false;
+    }
+    @Override
+    public void onResume() {
+        super.onResume();
+        if(isFirstLoad){
+            isFirstLoad = false;
+            reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        }
+    }
     private void buildDefaultCourseStatusFilterList() {
         mCourseFilterStatusBeans = new ArrayList<>();
         mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
@@ -125,7 +140,6 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         mViewBinding.recyclerView.setAdapter(mAdapter);
 
         buildDefaultCourseStatusFilterList();
-        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
     }
 
     private void queryCourse(boolean isShowLoading) {

+ 5 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/course/MineCourseActivity.java

@@ -6,6 +6,7 @@ import android.os.Bundle;
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
+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;
@@ -61,6 +62,8 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
             public void onPageSelected(int position) {
                 super.onPageSelected(position);
                 changeTableLayoutBar(position);
+                BaseMVPFragment fragment = (BaseMVPFragment) mFragments.get(position);
+                fragment.refreshData();
             }
         });
     }
@@ -110,6 +113,8 @@ public class MineCourseActivity extends BaseMVPActivity<ActivityMineCourseLayout
         MineCoursePageAdapter mineCoursePageAdapter = new MineCoursePageAdapter(this);
         mineCoursePageAdapter.setFragments(mFragments);
         viewBinding.viewPager.setAdapter(mineCoursePageAdapter);
+        viewBinding.viewPager.setOffscreenPageLimit(mFragments.size());
+
     }
 
     @Override

+ 17 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoRoomCourseFragment.java

@@ -66,6 +66,7 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
     private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
+    private boolean isFirstLoad = true;
 
     @Override
     protected FragmentPianoRoomCourseLayoutBinding getLayoutView() {
@@ -83,6 +84,22 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
         mViewBinding.tvCourseStatus.setOnClickListener(this);
     }
 
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter(currentSelectDate, currentCourseFilterStatus);
+        isFirstLoad = false;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if(isFirstLoad){
+            isFirstLoad = false;
+            reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        }
+    }
+
     private void buildDefaultCourseStatusFilterList() {
         mCourseFilterStatusBeans = new ArrayList<>();
         mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
@@ -145,7 +162,6 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
         buildDefaultCourseStatusFilterList();
-        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
     }
 
     private void queryCourse(boolean isShowLoading) {

+ 17 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/course/SparringCourseFragment.java

@@ -60,7 +60,7 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
     private PopupWindow mPopupWindow;
     private ArrayList<CourseFilterStatusBean> mCourseFilterStatusBeans;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
-
+    private boolean isFirstLoad = true;
     @Override
     protected FragmentSparringCourseLayoutBinding getLayoutView() {
         return FragmentSparringCourseLayoutBinding.inflate(getLayoutInflater());
@@ -77,6 +77,22 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
         mViewBinding.tvCourseStatus.setOnClickListener(this);
     }
 
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter(currentSelectDate,currentCourseFilterStatus);
+        isFirstLoad = false;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if(isFirstLoad){
+            isFirstLoad = false;
+            reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
+        }
+    }
+
     private void buildDefaultCourseStatusFilterList() {
         mCourseFilterStatusBeans = new ArrayList<>();
         mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseConstants.COURSE_FILTER_ALL, "全部"));
@@ -142,7 +158,6 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
         mViewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
         mViewBinding.recyclerView.setAdapter(mAdapter);
         buildDefaultCourseStatusFilterList();
-        reBuildFilter(null, CourseConstants.COURSE_FILTER_ALL);
     }
 
     private void queryCourse(boolean isShowLoading) {

+ 18 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/VideoCourseFragment.java

@@ -24,6 +24,7 @@ import com.cooleshow.teacher.adapter.CourseStatusFilterAdapter;
 import com.cooleshow.teacher.adapter.VideoCourseListAdapter;
 import com.cooleshow.teacher.bean.CourseFilterStatusBean;
 import com.cooleshow.teacher.bean.VideoCourseListBean;
+import com.cooleshow.teacher.constants.CourseConstants;
 import com.cooleshow.teacher.contract.VideoCourseContract;
 import com.cooleshow.teacher.databinding.FragmentVideoCourseLayoutBinding;
 import com.cooleshow.teacher.presenter.course.VideoCoursePresenter;
@@ -49,6 +50,7 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
     private PopupWindow mPopupWindow;
     private CourseStatusFilterAdapter mCourseStatusFilterAdapter;
     private boolean hasNext = true;
+    private boolean isFirstLoad = true;
 
     @Override
     protected FragmentVideoCourseLayoutBinding getLayoutView() {
@@ -65,6 +67,22 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         mViewBinding.tvSubject.setOnClickListener(this);
     }
 
+    @Override
+    public void refreshData() {
+        super.refreshData();
+        reBuildFilter();
+        isFirstLoad = false;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if(isFirstLoad){
+            isFirstLoad = false;
+            reBuildFilter();
+        }
+    }
+
     private void buildDefaultCourseStatusFilterList() {
 //        mCourseFilterStatusBeans = new ArrayList<>();
 //        mCourseFilterStatusBeans.add(new CourseFilterStatusBean(CourseFilterConstants.COURSE_FILTER_ALL, "全部"));
@@ -120,7 +138,6 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
         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) {