RecyclerView中滑动状态下对toolbar的隐藏和显示

来源:互联网 发布:淘宝宝贝详情教程 编辑:程序博客网 时间:2024/05/20 09:25

思路

   在RecyclerView中,通过获取当前第一个可见item的位置,从而来自定义出要求改变toolbar状态的位置,只需要通过距离的判断,就可以轻松设置toolbar的显示与隐藏。

设置自定义toolbar

<!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">    <!-- Customize your theme here. -->    <item name="colorPrimary">@color/colorPrimary</item>    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>    <item name="colorAccent">@color/colorAccent</item></style>

首先,我们在values文件夹下面的style.xml文件中选择“Theme.AppCompat.Light.NoActionBar“,即关闭系统默认的actionbar,然后再自定义一个toolbar。

<android.support.design.widget.AppBarLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize"        android:visibility="gone"        android:background="#7effffff"/></android.support.design.widget.AppBarLayout>

此时toolbar中的visibility属性选择gone,即活动进行时,我们默认隐藏toolbar。然后在MainAvtivity中找到这个控件并且设置。

        toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        ActionBar actionBar = getSupportActionBar();        actionBar.setDisplayHomeAsUpEnabled(true);

RecyclerView中获取当前位置

相比ListView,RecyclerView中如果想获取第一个和最后一个可见item的位置,需要借助LinearLayoutManager。

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {            @Override            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);            }            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                View c=recyclerView.getChildAt(0);                //得到RecyclerView中的0号元素                RecyclerView.LayoutManager layoutManager=recyclerView.getLayoutManager();                //判断是当前layoutManager是否为LinearLayoutManager                // 在recyclerView中只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法                if(layoutManager instanceof LinearLayoutManager){                    LinearLayoutManager linearManager=(LinearLayoutManager) layoutManager;                    int firstItemPosition = linearManager.findFirstVisibleItemPosition();                    //获取第一个可见view的位置                    int top = c.getTop();                    //获取第0个元素到页面顶部的距离                    float scale = getApplication().getResources().getDisplayMetrics().density;                    int dpvalue = (int) (20 * scale + 0.5f);                    int pxvalue = c.getHeight() - dpvalue;                    //通过计算,将单位dp转化为像素px,pxvalue即为toolbar状态改变的位置                    if (-top + firstItemPosition * c.getHeight() < pxvalue) {                        toolbar.setVisibility(View.VISIBLE);                    } else {                        toolbar.setVisibility(View.GONE);                    }                }            }        });

总结

在RecyclerView中,当前可见的第一个item的位置不能直接得到,而是要通过LinearLayoutManager对象中的方法得到,而在确定toolbar状态改变的位置时,需要进行单位转换,因为xml文件中距离是以dp为单位,而在实际界面中是以px为单位,因此如果需要确定准确的位置时,应当参考以上的转换方法。

阅读全文
1 0
原创粉丝点击