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.
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
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>
Utilisez cette ligne pour votre liste de recyclage:
Android:nestedScrollingEnabled="false"
essayez-le, recyclerview se déroulera facilement avec une hauteur flexible
[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
Pour corriger fling in RecyclerView
, vous devez écraser canScrollVertically
dans LinearLayoutManager
:
linearLayoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
return false;
}
};
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.
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
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);