瀏覽代碼

修改首页UI框架,适配底部达人风采和热门资讯滚动高度问题

Pq 2 年之前
父節點
當前提交
4df0a97269

+ 23 - 12
student/src/main/java/com/cooleshow/student/adapter/HomeBottomPageAdapter.java

@@ -18,26 +18,37 @@ import androidx.viewpager2.adapter.FragmentStateAdapter;
  * @author Ryan
  * 类说明:
  */
-public class HomeBottomPageAdapter extends FragmentStateAdapter {
-    private List<Fragment> mFragments;
+public class HomeBottomPageAdapter extends FragmentStatePagerAdapter {
 
-    public HomeBottomPageAdapter(@NonNull Fragment fragment) {
-        super(fragment);
-    }
+    // Tabs对应的fragment集合
+    private List<Fragment> fragments;
 
-    public void setFragments(List<Fragment> fragments) {
-        this.mFragments = fragments;
+    public HomeBottomPageAdapter(FragmentManager fm, List<Fragment> fragments) {
+        super(fm);
+        this.fragments = fragments;
     }
 
 
-    @NonNull
     @Override
-    public Fragment createFragment(int position) {
-        return mFragments.get(position);
+    public Fragment getItem(int position) {
+        return fragments.get(position);
+    }
+
+    @Override
+    public int getCount() {
+        return fragments == null ? 0 : fragments.size();
     }
 
     @Override
-    public int getItemCount() {
-        return mFragments != null ? mFragments.size() : 0;
+    public Object instantiateItem(ViewGroup container, int position) {
+
+        Fragment fragment = null;
+        try {
+            fragment = (Fragment) super.instantiateItem(container, position);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return fragment;
     }
 }

+ 50 - 17
student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragment.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.ui.main;
 
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 
@@ -40,8 +41,10 @@ import com.cooleshow.student.constants.CourseConstants;
 import com.cooleshow.student.contract.HomeContract;
 import com.cooleshow.student.databinding.FragmentNewHomeLayoutBinding;
 import com.cooleshow.student.presenter.main.HomePresenter;
+import com.cooleshow.student.widgets.AppBarLayoutStateChangeListener;
 import com.cooleshow.student.widgets.HomeHotAlbumDecoration;
 import com.cooleshow.student.widgets.HomeHotMusicSheetItemDecoration;
+import com.google.android.material.appbar.AppBarLayout;
 import com.scwang.smart.refresh.layout.SmartRefreshLayout;
 import com.youth.banner.Banner;
 import com.youth.banner.adapter.BannerImageAdapter;
@@ -163,17 +166,18 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
         mViewBinding.rvHotAlbum.setNestedScrollingEnabled(false);
         mViewBinding.rvVideoCourse.setNestedScrollingEnabled(false);
 
-        HomeBottomPageAdapter homeBottomPageAdapter = new HomeBottomPageAdapter(this);
         ArrayList<Fragment> bottomFragments = new ArrayList<>();
         mTalentStyleFragment = new TalentStyleFragment();
         mHotNewsFragment = new HotNewsFragment();
         bottomFragments.add(mTalentStyleFragment);
         bottomFragments.add(mHotNewsFragment);
-        homeBottomPageAdapter.setFragments(bottomFragments);
+        HomeBottomPageAdapter homeBottomPageAdapter = new HomeBottomPageAdapter(this.getChildFragmentManager(), bottomFragments);
+//        getChildFragmentManager().beginTransaction()
+//                .add(R.id.fl_talent_style_container, mTalentStyleFragment)
+//                .add(R.id.fl_hot_news_container, mHotNewsFragment).commit();
         mViewBinding.viewPagerBottom.setOffscreenPageLimit(bottomFragments.size());
         mViewBinding.viewPagerBottom.setAdapter(homeBottomPageAdapter);
 
-
         mMenuPagerAdapter = new HomeMenuPagerAdapter(getParentFragmentManager(), fragments);
         mViewBinding.viewpagerMenu.setAdapter(mMenuPagerAdapter);
         mBannerImageAdapter = new BannerImageAdapter<AppHomeBean.ItemBean>(itemBeans) {
@@ -215,8 +219,22 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
     }
 
     private void initListener() {
-        mViewBinding.viewPagerBottom.registerOnPageChangeCallback(onPageChangeCallback);
+        mViewBinding.viewPagerBottom.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                switchTabStyle(position);
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+
+            }
+        });
         mViewBinding.refreshLayout.setOnRefreshListener(refreshLayout -> {
             refreshLayout.finishRefresh();
             presenter.queryCountOfUnread();
@@ -286,21 +304,39 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
         });
 
 
-        mViewBinding.scrollLayout.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
-            boolean localVisibleRect = UiUtils.getLocalVisibleRect(getActivity(), banner, 10);
-            //banner可见的时候就自动循环,否则就停止,解决问题:在scrollview到最底部时候,由于banner自动到第一个时候就往上顶一段距离
-            if (localVisibleRect) {
-                if (null != banner) {
-                    banner.isAutoLoop(true);
-                }
-            } else {
-                if (null != banner) {
-                    banner.isAutoLoop(false);
+        mViewBinding.appBarLayout.addOnOffsetChangedListener(new AppBarLayoutStateChangeListener() {
+
+            @Override
+            public void onStateChanged(AppBarLayout appBarLayout, State state) {
+                switch (state) {
+                    case EXPANDED:    //展开
+                        Log.i("pq","展开");
+                        break;
+                    case COLLAPSED:    //折叠
+                        Log.i("pq","折叠");
+                        break;
+                    case INTERMEDIATE: //中间状态
+                        Log.i("pq","中间状态");
+                        break;
                 }
             }
         });
     }
 
+    private void resetBannerAuto() {
+        boolean localVisibleRect = UiUtils.getLocalVisibleRect(getActivity(), banner, 10);
+        //banner可见的时候就自动循环,否则就停止,解决问题:在scrollview到最底部时候,由于banner自动到第一个时候就往上顶一段距离
+        if (localVisibleRect) {
+            if (null != banner) {
+                banner.isAutoLoop(true);
+            }
+        } else {
+            if (null != banner) {
+                banner.isAutoLoop(false);
+            }
+        }
+    }
+
     @Override
     public void onResume() {
         super.onResume();
@@ -709,8 +745,5 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
     @Override
     public void onDestroy() {
         super.onDestroy();
-        if (mViewBinding != null && mViewBinding.viewPagerBottom != null) {
-            mViewBinding.viewPagerBottom.registerOnPageChangeCallback(onPageChangeCallback);
-        }
     }
 }

+ 42 - 0
student/src/main/java/com/cooleshow/student/widgets/AppBarLayoutStateChangeListener.java

@@ -0,0 +1,42 @@
+package com.cooleshow.student.widgets;
+
+/**
+ * Author by pq, Date on 2022/8/25.
+ */
+
+import com.google.android.material.appbar.AppBarLayout;
+
+/**
+ * 监听CollapsingToolbarLayout是折叠还是展开
+ */
+public abstract class AppBarLayoutStateChangeListener implements AppBarLayout.OnOffsetChangedListener{
+
+    public enum State{
+        EXPANDED,//展开
+        COLLAPSED,//折叠
+        INTERMEDIATE//中间状态
+    }
+    private State mCurrentState = State.INTERMEDIATE;
+
+    @Override
+    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
+        if (verticalOffset == 0) {
+            if (mCurrentState != State.EXPANDED) {
+                onStateChanged(appBarLayout, State.EXPANDED);
+            }
+            mCurrentState = State.EXPANDED;
+        } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
+            if (mCurrentState != State.COLLAPSED) {
+                onStateChanged(appBarLayout, State.COLLAPSED);
+            }
+            mCurrentState = State.COLLAPSED;
+        } else {
+            if (mCurrentState != State.INTERMEDIATE) {
+                onStateChanged(appBarLayout, State.INTERMEDIATE);
+            }
+            mCurrentState = State.INTERMEDIATE;
+        }
+    }
+
+    public abstract void onStateChanged(AppBarLayout appBarLayout, State state);
+}

+ 51 - 0
student/src/main/java/com/cooleshow/student/widgets/CustomViewPager.java

@@ -0,0 +1,51 @@
+package com.cooleshow.student.widgets;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.cooleshow.student.adapter.HomeBottomPageAdapter;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager.widget.ViewPager;
+import androidx.viewpager2.widget.ViewPager2;
+
+/**
+ * Author by pq, Date on 2022/8/31.
+ */
+public class CustomViewPager extends ViewPager {
+
+
+    public CustomViewPager(@NonNull Context context) {
+        super(context);
+    }
+
+    public CustomViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        int height = 0;
+        HomeBottomPageAdapter vpFragmentAdapter = (HomeBottomPageAdapter) getAdapter();
+        if (vpFragmentAdapter != null) {
+            View child = vpFragmentAdapter.getItem(getCurrentItem()).getView();
+            if (child != null) {
+                Log.i("pq", "viewpager=" + getCurrentItem());
+                child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+                height = child.getMeasuredHeight();
+            }
+        }
+        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+
+    public void resetHeight() {
+        requestLayout();
+    }
+}

文件差異過大導致無法顯示
+ 503 - 489
student/src/main/res/layout/fragment_new_home_layout.xml


部分文件因文件數量過多而無法顯示