web-dev-qa-db-fra.com

RecyclerView qui ne défile pas et affiche tous les éléments

J'ai un RecyclerView (et quelques autres vues) dans un ScrollView. Actuellement, le RecyclerView est présenté comme très petit (il montre 2 éléments sur 5 qu’il contient) et il défile indépendamment du ScrollView, ce qui n’est évidemment pas génial. Je souhaite que RecyclerView ne défile pas et s’étende pour que tous ses éléments soient visibles.

(Je sais que c'est stupide d'utiliser RecyclerView dans ce cas. Je le fais uniquement parce que quelque part dans l'application, j'ai besoin d'un RecyclerView normal avec défilement, etc. mais du même type de contenu, et je ne veux pas dupliquer le code ).

24
pstobiecki

C’est assez simple, il suffit de régler la hauteur de la RecyclerView sur wrap_content.

Vous pouvez également bénéficier de la désactivation du défilement imbriqué sur la vue du recycleur, comme suit:

RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
recycler.setNestedScrollingEnabled(false);
39
natario

La solution de setNestedScrollingEnabled (false) n'est pas aussi complète qu'elle le devrait: vous devez utiliser NestedScrollView au lieu de ScrollViewfocusableInTouchMode = "true" pour l'enfant de NestedScrollView.

Si vous insistez pour utiliser ScrollView, vous devez également définir minHeight sur RecyclerView, ainsi que overScrollMode = "never". Dans ce cas, ce n’est toujours pas une bonne solution car minHeight peut ne pas être suffisant dans certains cas.

Autres solutions alternatives que vous devriez envisager:

  1. Remplacez ScrollView & RecyclerView par un seul RecyclerView, qui contient des vues avec un type de vue supplémentaire pour ce que vous aviez dans ScrollView

  2. Utilisez GridLayout ou une autre disposition à la place.

21
android developer

Peut-être n’est-ce pas tout à fait clair au premier abord que faire avec toutes ces réponses… Je les ai juste essayées et la bonne méthode est:

<Android.support.v4.widget.NestedScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:id="@+id/person_properties"
        Android:orientation="vertical"
        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:overScrollMode="never" />
    </LinearLayout>
</Android.support.v4.widget.NestedScrollView>

Pas besoin de changer quoi que ce soit par programme.

4

en dessous de scrollview, utilisez pour désactiver le défilement, comme pour afficher tous les éléments de votre mise en page. Quelque chose comme ça pourrait marcher:

public class NoScrollRecycler extends RecyclerView {

    public NoScrollRecycler(Context context){
        super(context);
    }

    public NoScrollRecycler(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public NoScrollRecycler(Context context, AttributeSet attrs, int style){
        super(context, attrs, style);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev){

        //Ignore scroll events.
        if(ev.getAction() == MotionEvent.ACTION_MOVE)
            return true;

        //Dispatch event for non-scroll actions, namely clicks!
        return super.dispatchTouchEvent(ev);
    }
}

utiliser comme ceci:

<com.example.custom.NoScrollRecycler
    Android:id="@+id/recyclerView"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@color/color_white"/>
1
Pankaj Talaviya

Essayez aussi de jouer avec:

Android:overScrollMode
1
Atetc

Un moyen simple consiste à utiliser dans votre adaptateur personnalisé, dans la méthode onBindViewHolder cette ligne: holder.setIsRecyclable(false);

0
Guillermo Gonzalez