Je souhaite créer des options de filtres masqués au-dessus de recyclerview (par exemple, comme dans les anciennes versions de spotify):
Comment faire ça? J'utilise AppBar au-dessus de mon recycleur.
4 Réponses :
Vous pouvez le faire comme mentionné dans la réponse ci-dessus (avec une visibilité changeante de la vue de recherche, donc quand la visibilité est View.GONE, la recycleView se déplacera vers le haut, en utilisant ContraintLayout). Ou pour ajouter un ViewHolder supplémentaire à votre adaptateur (comme TopSearchViewHolder qui contient votre vue de recherche). Comme ceci (dans getItemViewType, vous décidez quand afficher un viewType particulier):
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val orderViewHolder = OrderViewHolder.create(parent).apply {
listener = this@OrdersAdapter.listener
}
return when (viewType) {
R.layout.list_item1 -> orderViewHolder
R.layout.list_item2 -> NetworkStateViewHolder.create(parent, retryCallback)
else -> throw IllegalAccessException("Unknown view type $viewType")
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) {
R.layout.list_item1 -> (holder as OrderViewHolder).bind(getItem(position))
R.layout.list_item2 -> (holder as NetworkStateViewHolder).bind(getItem(position))
}
}
override fun getItemViewType(position: Int): Int {
return if (hasExtraRow() && position == itemCount - 1) {
R.layout.list_item1
} else {
R.layout.list_item2
}
}
Vous pouvez utiliser ce code pour faire ce que vous voulez
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
//You should HIDE filter view here
} else if (dy < 0) {
System.out.println("Scrolled Upwards");
if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
//this is the top of the RecyclerView
System.out.println("==================================== >>>> Detect top of the item List");
//You should visible filter view here
} else {
//You should HIDE filter view here
}
} else {
System.out.println("No Vertical Scrolled");
//You should HIDE filter view here
}
}
});
Je teste cette solution maintenant. Comment ajouter une "vue filtrée" avec effet de défilement?
J'ai mis à jour ma réponse avec un commentaire (ex: // Vous devriez voir la vue filtre ici) s'il vous plaît vérifier ceci maintenant
Utilisez l'écouteur de défilement RecyclerView comme je l'ai mentionné dans le commentaire comme ceci
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/White"
android:orientation="vertical"
android:layout_gravity="center"
xmlns:android="http://schemas.android.com/apk/res/android">
//use FilterView here
//hide this view initially.
<Filter-view
android:visibility="gone"
android:id="@+id/filterView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/moviesRecyclerView"
android:layout_marginBottom="?attr/actionBarSize"/>
<TextView
android:visibility="gone"
android:layout_marginTop="@dimen/dimen_200dp"
android:id="@+id/noMoviesMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="@dimen/dimen_10dp"
android:fontFamily="@font/noirden_bold"
android:textColor="@color/Black"
android:textSize="@dimen/text_18sp"
android:text="@string/the_are_no_movies_showing_right_now_please_check_later"/>
</LinearLayout>
XML pour la mise en page RecyclerView
private static int firstVisibleInListview;
firstVisibleInListview = yourLayoutManager.findFirstVisibleItemPosition();
@Override
public void onScrollStateChanged(RecyclerView recyclerView,int newState){
super.onScrollStateChanged(recyclerView,newState);
}
@Override
public void onScrolled(RecyclerView recyclerView,int dx,int dy){
super.onScrolled(recyclerView,dx,dy);
int currentFirstVisible =
yourLayoutManager.findFirstVisibleItemPosition();
if(currentFirstVisible > firstVisibleInListview){
image.setVisibility(View.VISIBLE);
}else{
filterView.setVisibvility(View.GONE);
}
}
}
});
faites le moi savoir après avoir essayé ceci
vous vouliez que la vue filtrée soit masquée lorsque recyclerview est en haut? @MateuszKaflowski
Lorsque je commence l'activité et que je tente de faire défiler vers le haut, l'auditeur ne sera pas appelé.
vous voulez donc que la vue filtrée soit affichée lorsque la vue de recyclage est en haut? @MateuszKaflowski
@ Brahma Datta Oui.
Et quand doit-il être caché? Je suis désolé dans la capture d'écran, j'ai compris que la vue du filtre ne devrait être affichée que lorsque l'utilisateur fait défiler vers le bas @MateuszKaflowski.Pouvez-vous l'expliquer en bref?
Il doit se comporter comme le premier élément de recyclerview.
Continuons cette discussion dans le chat .
Ma solution pour l'instant:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
int dy = 0;
Handler handler = new Handler();
@Override
public void onScrollStateChanged(RecyclerView recyclerView, final int newState) {
super.onScrollStateChanged(recyclerView, newState);
final boolean isOnTop = layoutManager.findFirstCompletelyVisibleItemPosition() == 0;
if (isOnTop && newState == 1)
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (dy <= 0) {
KLog.d("show filter");
}
}
}, 20);
else if (newState == 1 && dy > 0)
KLog.e("gone filter");
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
this.dy = dy;
}
});
Pas super élégant et il faut encore trouver un moyen d'animer la vue cachée.
Alors, quel est le comportement prévu de ces vues? Devraient-ils s'afficher lorsque vous faites défiler ou lorsque vous cliquez sur quelque chose?
Quand j'essaye de faire défiler au-dessus du 1er élément.
Rendre cette mise en page visible lorsque l'utilisateur glisse vers le bas de la vue de recyclage dans addonscrollListener @MateuszKaflowski