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 ).
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);
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:
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
Utilisez GridLayout ou une autre disposition à la place.
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.
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"/>
Essayez aussi de jouer avec:
Android:overScrollMode
Un moyen simple consiste à utiliser dans votre adaptateur personnalisé, dans la méthode onBindViewHolder
cette ligne: holder.setIsRecyclable(false);