android - 在 RecyclerView/ListView onScroll 上隐藏 ActionBar

标签 android android-listview scroll android-actionbar vertical-scrolling

在我的应用程序中,我有一个 Activity ,顶部有某种操作栏,下面是 ListView 。我想要做的 - 是用列表向上滚动它,所以它隐藏,然后,当列表向下滚动时 - 它应该随着列表向下滚动,就像它只是在屏幕上边框上方一样。我怎样才能实现这个功能?

最佳答案

2015 年 6 月 3 日更新:

Google 现在使用 CoordinatorLayout 支持这一点。

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_done" />

</android.support.design.widget.CoordinatorLayout>

来源: https://github.com/chrisbanes/cheesesquare/blob/master/app/src/main/res/layout/include_list_viewpager.xml

记录在此: https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

原答案:

类似于 Google Play 音乐和 Umano 应用的示例:

https://github.com/umano/AndroidSlidingUpPanel

查看此存储库中的代码。当您向上滑动面板时,ActionBar 也会向上滑动。

来自演示:

   getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

   SlidingUpPanelLayout layout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout);
    layout.setShadowDrawable(getResources().getDrawable(R.drawable.above_shadow));
    layout.setAnchorPoint(0.3f);
    layout.setPanelSlideListener(new PanelSlideListener() {
        @Override
        public void onPanelSlide(View panel, float slideOffset) {
            Log.i(TAG, "onPanelSlide, offset " + slideOffset);
            if (slideOffset < 0.2) {
                if (getActionBar().isShowing()) {
                    getActionBar().hide();
                }
            } else {
                if (!getActionBar().isShowing()) {
                    getActionBar().show();
                }
            }
        }

        @Override
        public void onPanelExpanded(View panel) {
            Log.i(TAG, "onPanelExpanded");

        }

        @Override
        public void onPanelCollapsed(View panel) {
            Log.i(TAG, "onPanelCollapsed");

        }

        @Override
        public void onPanelAnchored(View panel) {
            Log.i(TAG, "onPanelAnchored");

        }
    });

在此处下载示例:

https://play.google.com/store/apps/details?id=com.sothree.umano

enter image description here

ListView - 没有库:

我最近想要相同的功能,这对我来说非常适合:

当用户向上滚动时,ActionBar 将被隐藏,以便让用户使用整个屏幕。

当用户向下滚动并松开时,ActionBar 将返回。

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

listView.setOnScrollListener(new OnScrollListener() {
    int mLastFirstVisibleItem = 0;

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {   }           

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {    
        if (view.getId() == listView.getId()) {
            final int currentFirstVisibleItem = listView.getFirstVisiblePosition();

            if (currentFirstVisibleItem > mLastFirstVisibleItem) {
                // getSherlockActivity().getSupportActionBar().hide();
                getSupportActionBar().hide();
            } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
                // getSherlockActivity().getSupportActionBar().show();
                getSupportActionBar().show();
            }

            mLastFirstVisibleItem = currentFirstVisibleItem;
        }               
    }
});

RecyclerView - 没有库

    this.mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        int mLastFirstVisibleItem = 0;

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            final int currentFirstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

            if (currentFirstVisibleItem > this.mLastFirstVisibleItem) {
                MainActivity.this.getSupportActionBar().hide();
            } else if (currentFirstVisibleItem < this.mLastFirstVisibleItem) {
                MainActivity.this.getSupportActionBar().show();
            }

            this.mLastFirstVisibleItem = currentFirstVisibleItem;
        }
    });

如果您需要更多帮助,请告诉我!

关于android - 在 RecyclerView/ListView onScroll 上隐藏 ActionBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13559275/

相关文章:

java - android - 如何以编程方式读取 list Intent ?

android - Adapter getView() 在每个位置之前两次请求位置 0。为什么?

javascript - 如何将滚动添加到 react-bootstrap Modal.Body

scroll - 垂直滚动不适用于 ionic 中的水平滚动列表

Android ListView 和 SimpleCursosrAdapter : nothing is showed

html - 可变高度容器内的垂直滚动导航

android - 如何从android中的事件坐标获取 View ?

Android InApp Billing v3 - 测试多台设备问题

android - Cocos2d-Android - Sprite.getcontentsize , Sprite.getscale , Sprite.gettexture 有什么区别

android - 在一个 fragment 上使用 ListView 选择的项目在另一个 fragment 上显示文本