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