26
2017
09

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

思路

   在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为单位,因此如果需要确定准确的位置时,应当参考以上的转换方法。

上一篇:SIM卡知识 下一篇:Android GPS定位