Skip to content

Commit c26049a

Browse files
graycreateclaude
andcommitted
fix: implement AppBarTracking to fix navbar scroll behavior
- 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 <[email protected]>
1 parent 1eb91b1 commit c26049a

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

app/src/main/java/me/ghui/v2er/module/home/MainActivity.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@
5858
import me.ghui.v2er.widget.BaseToolBar;
5959
import me.ghui.v2er.widget.CSlidingTabLayout;
6060
import me.ghui.v2er.widget.FollowProgressBtn;
61+
import me.ghui.v2er.widget.HackRecyclerView;
6162
import me.ghui.v2er.widget.dialog.ConfirmDialog;
6263
import me.ghui.v2er.widget.listener.AppBarStateChangeListener;
6364

6465
public class MainActivity extends BaseActivity implements View.OnClickListener,
6566
UpdateUnReadMsgDelegate, CheckInContract.IView, OnTabSelectListener,
66-
HomeFilterMenu.OnMenuItemClickListener {
67+
HomeFilterMenu.OnMenuItemClickListener, HackRecyclerView.AppBarTracking {
6768

6869
private static final String TAB_INDEX = KEY("tab_index");
6970
private static final String PAGE_ONE_DATA = KEY("page_one_data");
@@ -104,6 +105,10 @@ public class MainActivity extends BaseActivity implements View.OnClickListener,
104105
private VshareVersionChecker mVshareVersionChecker;
105106
private android.graphics.drawable.Drawable mOriginalNavIcon;
106107
private android.graphics.drawable.LayerDrawable mNavIconWithBadge;
108+
// For AppBarTracking - fix scroll behavior on some devices
109+
private int mAppBarOffset;
110+
private boolean mAppBarIdle = false;
111+
private int mAppBarMaxOffset;
107112

108113
@Override
109114
protected int attachLayoutRes() {
@@ -284,6 +289,10 @@ public void onDrawerOpened(View drawerView) {
284289
@Override
285290
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
286291
super.onOffsetChanged(appBarLayout, verticalOffset);
292+
// Track AppBar offset for AppBarTracking interface
293+
mAppBarOffset = verticalOffset;
294+
mAppBarIdle = (mAppBarOffset >= 0) || (mAppBarOffset <= mAppBarMaxOffset);
295+
287296
// Calculate toolbar's visibility based on its position
288297
int toolbarHeight = mToolbar.getHeight();
289298
int statusBarHeight = Utils.getStatusBarHeight();
@@ -309,6 +318,7 @@ public void onStateChanged(AppBarLayout appBarLayout, AppBarStateChangeListener.
309318
// IDLE state doesn't change the expanded status
310319
}
311320
});
321+
mAppBarLayout.post(() -> mAppBarMaxOffset = -mAppBarLayout.getTotalScrollRange());
312322

313323
TAB_TITLES[0] = TabInfo.getSelectTab().title;
314324
mViewPager.setAdapter(new SlidePagerAdapter(getSupportFragmentManager()));
@@ -642,6 +652,16 @@ public interface ChangeTabTypeDelegate {
642652
void changeTabType(TabInfo tabInfo);
643653
}
644654

655+
@Override
656+
public boolean isAppBarExpanded() {
657+
return mAppBarOffset == 0;
658+
}
659+
660+
@Override
661+
public boolean isAppBarIdle() {
662+
return mAppBarIdle;
663+
}
664+
645665
private class SlidePagerAdapter extends FragmentPagerAdapter {
646666

647667
public SlidePagerAdapter(FragmentManager fm) {

app/src/main/java/me/ghui/v2er/module/home/MsgFragment.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import me.ghui.v2er.module.topic.TopicActivity;
1717
import me.ghui.v2er.network.bean.NotificationInfo;
1818
import me.ghui.v2er.util.UserUtils;
19+
import me.ghui.v2er.widget.HackRecyclerView;
1920
import me.ghui.v2er.widget.LoadMoreRecyclerView;
2021

2122
/**
@@ -26,7 +27,7 @@ public class MsgFragment extends BaseHomeFragment<MsgContract.IPresenter>
2627
implements MsgContract.IView, MultiItemTypeAdapter.OnItemClickListener {
2728

2829
@BindView(R.id.base_recyclerview)
29-
LoadMoreRecyclerView mRecyclerView;
30+
HackRecyclerView mRecyclerView;
3031

3132
@Inject
3233
LoadMoreRecyclerView.Adapter<NotificationInfo.Reply> mAdapter;
@@ -86,6 +87,10 @@ protected void init() {
8687
mRecyclerView.setLayoutManager(mLayoutManager = new LinearLayoutManager(getContext()));
8788
mRecyclerView.addDivider();
8889
mRecyclerView.setAdapter(mAdapter);
90+
// Set AppBarTracking to fix scroll behavior on some devices
91+
if (getActivity() instanceof HackRecyclerView.AppBarTracking) {
92+
mRecyclerView.setAppBarTracking((HackRecyclerView.AppBarTracking) getActivity());
93+
}
8994
mRecyclerView.setOnLoadMoreListener(willLoadPage -> mPresenter.loadMore(willLoadPage));
9095

9196
RestoreData<NotificationInfo> restoreData = (RestoreData) getArguments().getSerializable(KEY_DATA);

app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import me.ghui.v2er.network.bean.TopicBasicInfo;
2121
import me.ghui.v2er.util.L;
2222
import me.ghui.v2er.util.UserUtils;
23+
import me.ghui.v2er.widget.HackRecyclerView;
2324
import me.ghui.v2er.widget.LoadMoreRecyclerView;
2425

2526
/**
@@ -30,7 +31,7 @@ public class NewsFragment extends BaseHomeFragment<NewsContract.IPresenter> impl
3031
MultiItemTypeAdapter.OnItemClickListener, MainActivity.ChangeTabTypeDelegate {
3132

3233
@BindView(R.id.base_recyclerview)
33-
LoadMoreRecyclerView mRecyclerView;
34+
HackRecyclerView mRecyclerView;
3435
@Inject
3536
LoadMoreRecyclerView.Adapter<NewsInfo.Item> mAdapter;
3637
private TabInfo mCurrentTab;
@@ -91,6 +92,10 @@ protected void init() {
9192
mRecyclerView.addDivider();
9293
mRecyclerView.setLayoutManager(mLayoutManager = new LinearLayoutManager(getContext()));
9394
mRecyclerView.setAdapter(mAdapter);
95+
// Set AppBarTracking to fix scroll behavior on some devices
96+
if (getActivity() instanceof HackRecyclerView.AppBarTracking) {
97+
mRecyclerView.setAppBarTracking((HackRecyclerView.AppBarTracking) getActivity());
98+
}
9499
mRecyclerView.setOnLoadMoreListener(willLoadPage -> {
95100
L.d("onLoadMore.willLoadPage: " + willLoadPage);
96101

0 commit comments

Comments
 (0)