31 votes

Comment faire défiler vers une position particulière dans le recyclerview à l'intérieur du scrollview ?

J'ai fait de nombreuses recherches sur ma question, mais aucune n'a été utile. J'ai une vue recyclée et des données statiques à l'intérieur d'une vue défilante qui est à l'intérieur d'un parentlayout Root comme indiqué ci-dessous.

J'ai mis -

scrollview.scrollto(0,0);

parce que chaque fois que j'ouvre l'activité, il saute au premier élément de la vue recyclée et il saute les données statiques au-dessus de la vue recyclée.

recyclerview.setNestedScrollingEnabled(false); 
recyclerview.setfocusable(false);

pour le smoothscroll.

le problème est avec

layoutmanager.scrollToPositionWithOffset(pos,0);

cela ne fonctionne pas. J'ai défini l'aboveline après avoir défini l'adaptateur sur recyclerview. J'ai également essayé avec NestedScrollView mais en vain.

bien que j'aie utilisé

layoutmanager.scrollToPosition(pos);

Pour ceux qui sautent le code, j'ai mis match_parent à ScrollView et fillviewport à true.

Voici ma maquette.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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/bottomsheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.inkdrops.khaalijeb.BrandCouponActivity">

    <RelativeLayout
        android:id="@+id/inclusionviewgroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <static data/>

        <ScrollView
            android:id="@+id/scrollviewmain"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/one"
            android:fillViewport="true"
            android:scrollbars="none"
            android:layout_above="@+id/donelayout">

            <staticdata/>

                <TextView
                    android:id="@+id/dealstext"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/card1"
                    android:layout_marginTop="10dp"
                    android:layout_marginLeft="10dp"
                    android:textSize="16sp"
                    android:text="Deals &amp; Coupons"
                    android:textColor="#444444" />

                <RelativeLayout
                    android:id="@+id/recyclerlayout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/dealstext"
                    android:layout_marginTop="5dp"
                    android:layout_marginLeft="8dp"
                    android:layout_marginRight="8dp"
                    android:background="@color/colorbackground">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/coupon_rec_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/colorbackground"
                        android:visibility="visible"/>

                </RelativeLayout>

                <statisdata>

            </RelativeLayout>

        </ScrollView>

        include layout="@layout/activity_coupons"
            android:visibility="gone"
            />

    </RelativeLayout>

</RelativeLayout>

0 votes

Pourriez-vous également afficher une partie de votre code Android ? Etes-vous sûr que vous faites référence au bon fichier layoutManager ? Pas le RecyclerView mais le ScrollView C'est vrai ?

0 votes

Vous voulez conserver la position de défilement lors d'une rotation ou vous voulez simplement faire défiler les pages à une certaine position de manière programmatique ?

0 votes

collez également votre adaptateur et le code de l'activité/fragment correspondant @akshay_shahane.

34voto

Pied Piper Points 5554

Besoin de faire défiler ScrollView en obtenant la première position de RecyclerView de l'enfant :

float y = recyclerView.getY() + recyclerView.getChildAt(selectedPosition).getY();    
scrollView.smoothScrollTo(0, (int) y);

0 votes

La vitesse de X est-elle nulle ?

0 votes

(sans regarder) J'espérais que ce serait similaire à jquery qui a la vitesse et y sur la méthode scrollto.

0voto

Pratik Pitale Points 533

vous pouvez utiliser la méthode de la vue défilante pour atteindre les endroits que vous souhaitez comme :

scrollView.smoothScrollTo(int x, int y);

-1voto

Bhavesh Misri Points 1067

Je sais que je réponds assez tard mais si vous avez un problème de défilement automatique, vous devez ajouter Android:descendantFocusability="blocsDescendants" dans votre RelativeLayout. Ainsi, votre balise RealtiveLyout ressemblera à ceci :

<RelativeLayout
    android:id="@+id/inclusionviewgroup"
    android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:layout_height="match_parent">

-2voto

Venkatesh Points 704

Etape 1 : Ajouter cette ligne pour sélectionner cette position dans le recyclerview

  adaptercat.setSelectedItem(Integer.parseInt(dealtypeid));

Étape 2 : Une fois que vous avez vérifié le constructeur ci-dessous en obtenant la position actuelle

  public CatgerotyAdapter(Context context, ArrayList<HashMap<String, String>> arraylist,String selectedPosition) {
        this.context = context;
        this.data = arraylist;
        resultp = new HashMap<>();
        currentItemPos=Integer.parseInt(selectedPosition)-1;
    }

Étape 3 : Et cette fonction aussi dans l'adaptateur

  public void setCurrentItem(int item)
    {
        this.currentItemPos = item;
    }

Dernière étape 4. Ajoutez cette fonction en dehors de l'adaptateur dans votre classe

 private void onPagerItemClick2(Integer tag)
{
    adaptercat.setCurrentItem(tag);
    catsp.setAdapter(adaptercat);
}

Ajoutez cette ligne dans votre liste d'éléments en cliquant sur le bouton "Listner".

  ((ClassName) context).onPagerItemClick2(position);

Cette position sera sélectionnée lorsque vous ouvrirez la liste

-3voto

user1954788 Points 11

Utilisez cette méthode scrollToPosition (int position) Cela fonctionne pour moi. J'espère que cela vous aidera.

        mMessagesRecyclerView = (RecyclerView) findViewById(R.id.messagesRecyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setStackFromEnd(true);

        mMessagesRecyclerView.setLayoutManager(layoutManager);
        mMessagesAdapter = new MessagesAdapter();
        mMessagesRecyclerView.setAdapter(mMessagesAdapter);

        mMessagesRecyclerView.scrollToPosition(your position);

voici mon layoutstructer

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X