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);