我尝试了很多代码,或多或少的给我找你想要的东西。这是一个替代的解决方案,但你需要改变AppBarLayout一个简单的观点...看看这个:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/annonce.main.coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="RtlHardcoded">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- here you put your search bar, can be any view !-->
<android.support.v7.widget.CardView
android:id="@+id/searchbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="4dp"
app:cardUseCompatPadding="true"
app:layout_behavior="[package].RecyclerSearchBehavior">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="Pesquise aqui"
android:minHeight="58dp"/>
</android.support.v7.widget.CardView>
注:这是一个CoordinatorLayout内。 创建视图是使用搜索栏,你的类型的行为:
public class RecyclerSearchBehavior extends CoordinatorLayout.Behavior<CardView> {
//Initial height and location
private int mViewHeight;
private int[] mViewStartLocation;
public RecyclerSearchBehavior(Context context, AttributeSet attrs) {
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, final CardView child, View dependency) {
//the first function called. The initial variables settings.
//getting height
mViewHeight = child.getHeight();
//getting location on screen
mViewStartLocation = new int[2];
child.getLocationOnScreen(mViewStartLocation);
//if the dependecy is your recycler
if (dependency instanceof RecyclerView)
//add scroll listener
((RecyclerView) dependency).addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
//here the magic happens
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//animate function
animate(child, dy);
}
});
return dependency instanceof RecyclerView;
}
private void animate(CardView child, int dy) {
//the initial position of your search bar is 0, because it is on top, so...
if (child.getY() <= 0)
//dy is an integer that shows you if user scrolls up or down
if (dy >= 0) {
//move to top is a negative value, so *-1
//if that is < than height, scrools up
if ((child.getY() * -1) <= (mViewHeight))
child.setTranslationY(child.getY() - dy * 0.1f);
} else {
//if the position of search bar is < than zero, scrolls down
if (child.getY() < 0)
child.setTranslationY(child.getY() - dy * 0.1f);
//else, put the view on 0y
else child.setY(0);
}
//else, put the view on 0y again. this function is called after any user
//touches... so everything happens fast and with numbers different than
//1
else child.setY(0);
}
}
而完成的。你的“搜索栏”就在这里。
这里唯一的问题是,您需要为您的Recycler上的第一个项目添加填充,或者将第一个项目作为透明视图添加填充。
你想NestedScrollView滚动AppbarLayout下? – jayeshsolanki93
我希望NestedScrollView的内容紧密地拥抱搜索区域,但现在在搜索区域上方没有内容可见,而在它下面有一条灰色的线将搜索区域与内容分隔开。 编辑:是的,这就是我想要的。 – joharei
尝试在AppbarLayout和NestedScrollView中添加'android:fitsSystemWindows =“true”' – jayeshsolanki93