web-dev-qa-db-fra.com

Utilisez RecyclerView dans ScrollView avec une hauteur d'élément Recycler flexible

Je souhaite savoir s'il existe un moyen d'utiliser RecyclerView ?

avant cela, j'utilise RecyclerView avec fix height à l'intérieur d'un ScrollView mais cette fois, je ne connais pas la hauteur de l'élément. 

Astuce : J'ai lu toutes les questions et solutions de questions de pile avant de poser cette question depuis 4 jours.

mise à jour: une solution apprend à faire défiler RecyclerView seul, mais je souhaite afficher cette fonctionnalité étendue.

13
Ashkan

Je cherche à répondre à cette question partout dans le monde, mais je n’ai trouvé aucune réponse directe à cette question populaire. Enfin, j'ai mélangé un truc ensemble et résolu ce problème!

Mon problème a commencé lorsque mon supérieur hiérarchique m'a demandé d'utiliser un RecyclerView à l'intérieur d'un ScrollView, et comme vous le savez, nous ne pouvons pas utiliser deux Scrollabledéfinir ou connaître hauteur de l'élément fixe pour notre RecyclerView. et voici la réponse:

Étape 1: Tout d'abord, vous devriez trouver la hauteur de votre article RecyclerView, ce qui est possible à partir de votre RecyclerView> onBindViewHolder

holder.itemView.post(new Runnable() {
        @Override
        public void run() {

            int cellWidth = holder.itemView.getWidth();// this will give you cell width dynamically
            int cellHeight = holder.itemView.getHeight();// this will give you cell height dynamically

            dynamicHeight.HeightChange(position, cellHeight); //call your iterface hear
        }
    });

avec ce code, vous trouvez la hauteur de votre article au fur et à mesure qu’ils se construisent et l’envoient à votre activité avec interface

pour les amis qui ont un problème avec l'interface, je laisse le code d'interface ci-dessous qui devrait écrire dans Adapter.

public interface DynamicHeight {
    void HeightChange (int position, int height);
}

Étape 2: Nous avons trouvé la hauteur de notre article à ce jour et nous souhaitons maintenant définir la hauteur de notre RecyclerView. nous devrions d’abord calculer la somme de la hauteur de l’article. dans cette étape, nous faisons cela par BitMap first implémente dernière étape interface et écrivons le code ci-dessous dans votre Activité ou Fragment qui définit votre RecyclerView:

@Override
public void HeightChange(int position, int height) {
    itemHeight.put(position, height);
    sumHeight = SumHashItem (itemHeight);

    float density = activity.getResources().getDisplayMetrics().density;
    float viewHeight = sumHeight * density;
    review_recyclerView.getLayoutParams().height = (int) sumHeight;

    int i = review_recyclerView.getLayoutParams().height;
}

int SumHashItem (HashMap<Integer, Integer> hashMap) {
    int sum = 0;

    for(Map.Entry<Integer, Integer> myItem: hashMap.entrySet())  {
        sum += myItem.getValue();
    }

    return sum;
}

Étape 3: Nous avons maintenant la somme de votre hauteur RecyclerView. pour la dernière étape, nous devrions simplement envoyer l'interface que nous avons écrite dans la dernière étape à l'adaptateur avec un code comme celui-ci:

reviewRecyclerAdapter = new ReviewRecyclerAdapter(activity, reviewList, review_recyclerView, this);

quand vous implémentez interface, vous devriez l'envoyer à votre contexte que j'utilise ceci.

Profitez-en

10
Ashkan

Si vous voulez simplement faire défiler, vous pouvez utiliser pour NestedScrollView au lieu de ScrollView Ainsi, vous pouvez modifier votre code avec les éléments suivants: 

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

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

            //design your content here with RecyclerView 

    </LinearLayout>

</Android.support.v4.widget.NestedScrollView>
10
Bhunnu Baba

Utilisez cette ligne pour votre liste de recyclage:

Android:nestedScrollingEnabled="false"

essayez-le, recyclerview se déroulera facilement avec une hauteur flexible

8
tahaDev

[RÉSOLU] J'ai le même problème avec recycleview horizontal . Changer le rapport de classement pour recycleview

 compile 'com.Android.support:recyclerview-v7:23.2.1'

Écrivez ceci: linearLayoutManager.setAutoMeasureEnabled(true);

Correction de bugs liés aux différentes méthodes de mesure-spec dans update

Vérifiez http://developer.Android.com/intl/es/tools/support-library/features.html#v7-recyclerview

J'ai trouvé un problème avec la bibliothèque 23.2.1: Lorsque l'élément est match_parent recycler afficher tout l'élément à afficher, veuillez toujours utiliser min height or "wrap_content".

Merci

7
Amit

Pour corriger fling in RecyclerView, vous devez écraser canScrollVertically dans LinearLayoutManager:

linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};
6
Michał Ciołek

Je suis entièrement d'accord avec la solution d'Ashkan, merci (voté +1!), Mais il y a une chose ...

Si RecyclerView défile correctement dans ScrollView/NestedScrollView MAIS il ne jette pas (intercepte), la solution consiste à étendre RecyclerView et à remplacer OnInterceptTouchEvent et OnTouchEvent. Si vous n'avez besoin d'aucune action de clic mais que vous souhaitez simplement présenter des éléments avec un travail qui fonctionne, renvoyez simplement false dans les deux cas ci-dessous:

public class InterceptingRecyclerView extends RecyclerView {

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

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

    public InterceptingRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }
}

Ou en fait, cela devrait s'appeler NonInterception ...;) Aussi simple que cela.

2
Darek Deoniziak

Si le réglage de la hauteur fixe pour le RecyclerView ne fonctionnait pas pour quelqu'un (comme moi), voici ce que j'ai ajouté à la solution à hauteur fixe:

   mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            rv.getParent().requestDisallowInterceptTouchEvent(true);
            break;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

Je

2
John smith

J'ai résolu ce problème en utilisant NestedScrollView au lieu de ScrollView. Et pour RecyclerView

    <Android.support.v7.widget.RecyclerView 
Android:layout_width="match_parent"
  Android:layout_height="match_parent" />

Et en code

recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);
1
Arun PK