From c26049ae0bae1681692814a3194271df6e9a3472 Mon Sep 17 00:00:00 2001 From: graycreate Date: Mon, 1 Dec 2025 18:58:42 +0800 Subject: [PATCH] fix: implement AppBarTracking to fix navbar scroll behavior MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Make MainActivity implement HackRecyclerView.AppBarTracking interface - Add AppBar offset tracking fields and methods - Update NewsFragment and MsgFragment to set AppBarTracking on their RecyclerViews - Fixes issue where navbar doesn't auto-hide when scrolling on some devices (e.g., Pixel 10) The root cause was that HackRecyclerView's custom nested scroll handling in dispatchNestedPreScroll() relies on AppBarTracking interface to get the AppBar state, but MainActivity wasn't implementing this interface. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../ghui/v2er/module/home/MainActivity.java | 22 ++++++++++++++++++- .../me/ghui/v2er/module/home/MsgFragment.java | 7 +++++- .../ghui/v2er/module/home/NewsFragment.java | 7 +++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java index 6f635fc2..b4af432f 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java @@ -58,12 +58,13 @@ import me.ghui.v2er.widget.BaseToolBar; import me.ghui.v2er.widget.CSlidingTabLayout; import me.ghui.v2er.widget.FollowProgressBtn; +import me.ghui.v2er.widget.HackRecyclerView; import me.ghui.v2er.widget.dialog.ConfirmDialog; import me.ghui.v2er.widget.listener.AppBarStateChangeListener; public class MainActivity extends BaseActivity implements View.OnClickListener, UpdateUnReadMsgDelegate, CheckInContract.IView, OnTabSelectListener, - HomeFilterMenu.OnMenuItemClickListener { + HomeFilterMenu.OnMenuItemClickListener, HackRecyclerView.AppBarTracking { private static final String TAB_INDEX = KEY("tab_index"); private static final String PAGE_ONE_DATA = KEY("page_one_data"); @@ -104,6 +105,10 @@ public class MainActivity extends BaseActivity implements View.OnClickListener, private VshareVersionChecker mVshareVersionChecker; private android.graphics.drawable.Drawable mOriginalNavIcon; private android.graphics.drawable.LayerDrawable mNavIconWithBadge; + // For AppBarTracking - fix scroll behavior on some devices + private int mAppBarOffset; + private boolean mAppBarIdle = false; + private int mAppBarMaxOffset; @Override protected int attachLayoutRes() { @@ -284,6 +289,10 @@ public void onDrawerOpened(View drawerView) { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { super.onOffsetChanged(appBarLayout, verticalOffset); + // Track AppBar offset for AppBarTracking interface + mAppBarOffset = verticalOffset; + mAppBarIdle = (mAppBarOffset >= 0) || (mAppBarOffset <= mAppBarMaxOffset); + // Calculate toolbar's visibility based on its position int toolbarHeight = mToolbar.getHeight(); int statusBarHeight = Utils.getStatusBarHeight(); @@ -309,6 +318,7 @@ public void onStateChanged(AppBarLayout appBarLayout, AppBarStateChangeListener. // IDLE state doesn't change the expanded status } }); + mAppBarLayout.post(() -> mAppBarMaxOffset = -mAppBarLayout.getTotalScrollRange()); TAB_TITLES[0] = TabInfo.getSelectTab().title; mViewPager.setAdapter(new SlidePagerAdapter(getSupportFragmentManager())); @@ -642,6 +652,16 @@ public interface ChangeTabTypeDelegate { void changeTabType(TabInfo tabInfo); } + @Override + public boolean isAppBarExpanded() { + return mAppBarOffset == 0; + } + + @Override + public boolean isAppBarIdle() { + return mAppBarIdle; + } + private class SlidePagerAdapter extends FragmentPagerAdapter { public SlidePagerAdapter(FragmentManager fm) { diff --git a/app/src/main/java/me/ghui/v2er/module/home/MsgFragment.java b/app/src/main/java/me/ghui/v2er/module/home/MsgFragment.java index 60ca401c..9e2d8740 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/MsgFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/home/MsgFragment.java @@ -16,6 +16,7 @@ import me.ghui.v2er.module.topic.TopicActivity; import me.ghui.v2er.network.bean.NotificationInfo; import me.ghui.v2er.util.UserUtils; +import me.ghui.v2er.widget.HackRecyclerView; import me.ghui.v2er.widget.LoadMoreRecyclerView; /** @@ -26,7 +27,7 @@ public class MsgFragment extends BaseHomeFragment implements MsgContract.IView, MultiItemTypeAdapter.OnItemClickListener { @BindView(R.id.base_recyclerview) - LoadMoreRecyclerView mRecyclerView; + HackRecyclerView mRecyclerView; @Inject LoadMoreRecyclerView.Adapter mAdapter; @@ -86,6 +87,10 @@ protected void init() { mRecyclerView.setLayoutManager(mLayoutManager = new LinearLayoutManager(getContext())); mRecyclerView.addDivider(); mRecyclerView.setAdapter(mAdapter); + // Set AppBarTracking to fix scroll behavior on some devices + if (getActivity() instanceof HackRecyclerView.AppBarTracking) { + mRecyclerView.setAppBarTracking((HackRecyclerView.AppBarTracking) getActivity()); + } mRecyclerView.setOnLoadMoreListener(willLoadPage -> mPresenter.loadMore(willLoadPage)); RestoreData restoreData = (RestoreData) getArguments().getSerializable(KEY_DATA); diff --git a/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java b/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java index ac63932b..e084548b 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java @@ -20,6 +20,7 @@ import me.ghui.v2er.network.bean.TopicBasicInfo; import me.ghui.v2er.util.L; import me.ghui.v2er.util.UserUtils; +import me.ghui.v2er.widget.HackRecyclerView; import me.ghui.v2er.widget.LoadMoreRecyclerView; /** @@ -30,7 +31,7 @@ public class NewsFragment extends BaseHomeFragment impl MultiItemTypeAdapter.OnItemClickListener, MainActivity.ChangeTabTypeDelegate { @BindView(R.id.base_recyclerview) - LoadMoreRecyclerView mRecyclerView; + HackRecyclerView mRecyclerView; @Inject LoadMoreRecyclerView.Adapter mAdapter; private TabInfo mCurrentTab; @@ -91,6 +92,10 @@ protected void init() { mRecyclerView.addDivider(); mRecyclerView.setLayoutManager(mLayoutManager = new LinearLayoutManager(getContext())); mRecyclerView.setAdapter(mAdapter); + // Set AppBarTracking to fix scroll behavior on some devices + if (getActivity() instanceof HackRecyclerView.AppBarTracking) { + mRecyclerView.setAppBarTracking((HackRecyclerView.AppBarTracking) getActivity()); + } mRecyclerView.setOnLoadMoreListener(willLoadPage -> { L.d("onLoadMore.willLoadPage: " + willLoadPage);