2
votes

Vue cachée au-dessus de RecyclerView

Je souhaite créer des options de filtres masqués au-dessus de recyclerview (par exemple, comme dans les anciennes versions de spotify):

 entrez la description de l'image ici

Comment faire ça? J'utilise AppBar au-dessus de mon recycleur.


3 commentaires

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


4 Réponses :


2
votes

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
        }
    }


0 commentaires

1
votes

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
                        }
                    }
                });


2 commentaires

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



1
votes

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


7 commentaires

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 .



0
votes

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.


0 commentaires