13

Ich möchte wissen, gibt es eine mögliche Verwendung RecyclerView?Verwenden Sie RecyclerView innerhalb ScrollView mit flexiblem Recycler Artikel Höhe

vor diesem Ich benutze RecyclerView mit fix Höhe in einem Scroll diesmal aber ich weiß nicht, Höhe des Elements.

Hinweis: Ich lese alle Frage und Lösung von Stapel Frage vor dieser Frage seit 4 Tagen zu stellen.

Update: einige Lösung erfahren, wie RecyclerView auf eigene Faust zu bewegen, aber ich möchte diese erweitert zeigen.

+0

Was ist Ihr Problem gescrollt werden? –

+2

@OmarHassan Ich sollte mehr als einen ** RecyclerView ** in einem ** ScrollView ** verwenden. nur es – Ashkan

+0

nicht von den oben genannten helfen mir ... nur diese Antwort Post hier: [Recyclerview in Scrollview] (http://Stackoverflow.com/a/36979664/4240256) –

Antwort

11

Ich suche um diese Frage auf der ganzen Welt zu beantworten, aber ich habe keine direkte Antwort auf diese populäre Frage gefunden. Endlich habe ich einen Trick gemixt und dieses Problem gelöst!

Mein Problem starten, wenn mein Chef hat mich gebeten, ein RecyclerView in einem Scroll, zu verwenden und wie Sie wissen, dass wir nicht außer zwei Scrollbare Objekte ineinander verwenden können, wenn wir setzen oder fix Artikel Höhe wissen für unsere RecyclerView. und dies ist die Antwort:

Schritt 1: zunächst sollten Sie Ihre RecyclerView flexible Element Höhe finden und dies ist möglich, von Ihrem 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 
     } 
    }); 

mit diesem Code, den Sie finden Ihre Artikel Höhe wie sie bauen und senden Sie die Artikel Höhe zu Ihrer Aktivität mit Schnittstelle.

für die Freunde, die Probleme mit der Schnittstelle haben, lasse ich den Schnittstellencode darunter, der in Adapter schreiben sollte.

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

Schritt 2: fanden wir unsere Artikel Höhe so weit und jetzt wollen wir die Höhe unserer RecyclerView einzustellen. Zuerst sollten wir die Summe der Artikelhöhe berechnen.in diesem Schritt tun wir dies durch BitMap ersten implementiert letzten Schritt Schnittstelle und diesen Code unten in Ihrer Aktivität oder Fragment, die Ihre RecyclerView definieren schreiben:

@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; 
} 

Schritt 3: Jetzt haben wir die Summe Ihrer RecyclerView-Höhe. für den letzten Schritt sollten wir nur die Schnittstelle senden, die wir in letzter Schritt schreiben mit einigen Code wie folgt an Adapter:

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

wenn Sie Schnittstelle implementieren , sollten Sie es zu Ihrem mit Ihrem Kontext senden, die ich verwenden dies.

Genießen Sie es

+0

ich kann es nicht herausfinden ... einige Fehler zu bekommen .. können Sie bitte vollständige Beispiel mit Adapter Klasse und Recyclerview Implementierung –

+0

@HetalUpadhyay welchen Teil haben Sie Fehler? diese Woche habe ich nicht genug Zeit dafür. aber wenn Sie nicht in hurry sind, werde ich es für Sie tun – Ashkan

+0

eigentlich bekomme ich keinen Fehler, aber wenn ich den gleichen Code mit horizontalen Recycler versuchte es anzeigen nichts anzuzeigen ... so wird es Ihnen dankbar sein, wenn Sie einen Code bereitstellen können das funktioniert in beiden Fällen horizontal und vertikal scrollen –

2

Bei fester Höheneinstellung für die RecyclerView nicht für jemanden funktioniert (wie ich), hier ist das, was ich zu der festen Höhe Lösung hinzugefügt habe:

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) { 

    } 
}); 

I

+1

Ich habe es noch nicht getestet, aber ich denke, dass Ihr Code ** RecyclerView ** selbst scrollen möchte. Ich werde es heute versuchen. tnx lieber Freund – Ashkan

+1

Ich habe nicht geholfen, wie ich schon sagte, es hilft RecyclerView auf eigene Faust mit fixer Höhe zu scrollen. Es ist nicht mein Ziel. – Ashkan

+0

vielen dank. Nur deine Antwort hat mir geholfen – neustart47

2

ich voll und ganz mit Ashkan Lösung zustimmen, großer Dank (gestimmt 1!), Aber es ist eine Sache ...

Wenn RecyclerView nicht bewegt richtig in Scrollview/NestedScrollView aber es doesn 't fling (abfangen), dann ist die Lösung, RecyclerView zu erweitern und OnInterceptTouchEvent und OnTouchEvent zu überschreiben. Wenn Sie keine Klick-Aktionen müssen aber wollen nur Produkte mit Arbeits fling präsentieren dann wieder einfach falsch in beide wie unten:

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; 
    } 
} 

Oder eigentlich sollte es NonIntercepting ... genannt werden;) So einfach ist das.

7

[BEHOBEN] Ich habe das gleiche Problem mit horizontalem recycleview. ändern Gradle Repo für recycleview

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

: Schreibe: linearLayoutManager.setAutoMeasureEnabled(true);

Fehler behoben im Zusammenhang mit verschiedenen Maß-Spezifikation Methoden in Update

prüfen http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

ich Problem mit 23,2 gefunden.1 Bibliothek: Wenn Artikel match_parent recycle Ansicht füllt vollständigen Artikel ist, zu betrachten, bitte immer gehen mit min height or "wrap_content".

Dank

6

zu beheben fling in RecyclerView Sie canScrollVertically in LinearLayoutManager außer Kraft setzen müssen:

linearLayoutManager = new LinearLayoutManager(context) { 
@Override 
public boolean canScrollVertically() { 
    return false; 
} 
}; 
+0

Um diese Antwort hinzuzufügen, müssen Sie auch NestedScrollView verwenden, diese Antwort allein funktioniert nicht auf Android 7+: \ – OmarBizreh

1

Wenn Sie möchten nur scrollen, dann können Sie verwenden NestedScrollView anstelle von ScrollView So können Sie Ihren Code ändern, mit folgenden:

<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> 
3

Verwendung Diese Zeile in recyclerview:

 android:nestedScrollingEnabled="false" 

es versuchen, werden recyclerview glatt mit flexiblen Höhe