2015-04-14 1 views
5

Ich baue einen Einkaufswagen RecyclerView, der alle Artikel im Warenkorb in einem RecyclerView anzeigt, sowie eine zusätzliche Ansicht am unteren Rand, die den Einkaufswagen zusammenfasst (Gesamtbetrag, ggf. Gutschein-Rabatt usw.).Ist es möglich, das letzte Element in einem RecyclerView an den Boden anzudocken, wenn kein Scrollen erforderlich ist?

Wenn> 3 Elemente im Warenkorb sind, sieht es gut aus, da der Benutzer nach unten scrollen muss, um die "Übersichtsansicht" anzuzeigen. Wenn jedoch 1 oder 2 Elemente vorhanden sind, werden die ersten Elemente angezeigt, dann die Zusammenfassungsansicht und dann Leerzeichen. Ich würde lieber die ersten Elemente, dann Whitespace, dann die Übersichtsansicht.

Ich habe versucht, leere Elemente hinzuzufügen, aber abhängig von der Auflösung des Geräts sieht es inkonsistent.

Aktuelle Erscheinung, wenn weniger als 3 Punkte (dh wenn kein Scrollen erforderlich):

----------- 
| Item1 | 
| ------- | 
| Item2 | 
| ------- | 
| Summary | 
| ------- | 
|   | 
|   | 
|   | 
|   | 
---------- 

gewünschte Aussehen:

----------- 
| Item1 | 
| ------- | 
| Item2 | 
| ------- | 
|   | 
|   | 
|   | 
|   | 
| ------- | 
| Summary | 
---------- 
+0

Vielleicht können Sie schließlich Ihre eigenen linearen Layout-Manager, dass die Art und Weise umzusetzen. Aber ich würde eher einen anderen Weg in Betracht ziehen: Fügen Sie Ihre Zusammenfassung in eine separate Ansicht unterhalb der Recycler-Ansicht ein. Sobald die Recycleransicht geblättert werden muss, fügen Sie am unteren Rand ein neues Übersichtselement hinzu und animieren gleichzeitig diese zusätzliche Ansicht, die nach unten rutscht und verschwindet. – AndroidEx

Antwort

2

Ich habe über Ihre Aufgabe nachgedacht und schließlich einen Code zusammengestellt, den Sie vielleicht nützlich finden. Es gibt jedoch ein Problem auf dieser Bühne.

Was ich getan habe ist ein Element Dekorateur zu einer Recycler Ansicht hinzugefügt:

recyclerView.addItemDecoration(new StickySummaryDecoration()); 

Und hier ist meine Anwendung des Grund Dekorateur (ehrlich gesagt, es ist meine erste Erfahrung mit Artikeln Dekorateure, so dass es möglicherweise nicht optimal oder total korrekt aber ich habe mein Bestes gegeben):

public class StickySummaryDecoration extends RecyclerView.ItemDecoration { 

    @Override 
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 
     int childCount = parent.getAdapter().getItemCount(); 
     int lastVisibleItemPosition = 
       ((LinearLayoutManager) parent.getLayoutManager()).findLastVisibleItemPosition(); 
     int firstVisiblePosition = 
       ((LinearLayoutManager) parent.getLayoutManager()) 
         .findFirstCompletelyVisibleItemPosition(); 
     if ((firstVisiblePosition == 0) && (lastVisibleItemPosition == (childCount - 1))) { 
      View summaryView = parent.getChildAt(parent.getChildCount() - 1); 
      int topOffset = parent.getHeight() - summaryView.getHeight(); 
      int leftOffset = 
        ((RecyclerView.LayoutParams) summaryView.getLayoutParams()).leftMargin; 
      c.save(); 
      c.translate(leftOffset, topOffset); 
      summaryView.draw(c); 
      c.restore(); 
      summaryView.setVisibility(View.GONE); 
     } 
    } 
} 

Also was ich damit bekomme.

Bottom-dockt Zusammenfassung in der kurzen Liste:

Short list

Sie müssen die Zusammenfassung in der langen Liste zu sehen, nach unten scrollen:

Long list (you need to scroll down to see the summary element)

Jetzt über ein Problem. Dieser Nebeneffekt beim Zurückscrollen in der langen Liste ist, was ich noch nicht gelöst habe.

problem

Meine Experimente sind mit einem für alle Fälle github repo hochgeladen :)

EDIT

Gerade jetzt habe ich zu mir kam, dass das fehlende Zeilenelement in der Recycler Ansicht meine recycelt ist Zusammenfassungsansicht Inhaber, der GONE Sichtbarkeit hat. Es sollte ein Weg sein, um es wieder ...

EDIT 2

ich meine erste Lösung überdacht und verändert den Code ein wenig für die lange Liste Fall zu berücksichtigen (in diesem Fall der Artikel Dekoration ist deaktiviert (ich denke, es ist näher an dem, was Sie erreichen wollten), löst dies automatisch das fehlende Zeilenproblem.

2

Dies ist kein beabsichtigter Anwendungsfall, aber sie schafft eine ItemDecorator und wenn getItemOffsets wird in der unteren Ansicht aufgerufen, berechnet den darüber liegenden Raum und legt ihn als decorOffsetTop fest.

Jedes Mal, wenn Sie ein Element hinzufügen, sollten Sie die Objektdekor-Offsets ungültig machen, damit RecyclerView Ihren Callback für eine neue Berechnung erneut aufruft.

Es wird nicht trivial sein, aber das sollte funktionieren.

3

Basierend auf the answer by yigit habe ich eine funktionierende Implementierung erstellt. Verlängern ItemDecoration und außer Kraft setzen getItemOffsets():

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    int childCount = parent.getAdapter().getItemCount(); 
    if (parent.getChildLayoutPosition(view) != childCount - 1) return; 
    int lastViewBottom = calculateViewBottom(parent.getLayoutManager().findViewByPosition(childCount - 2)); 

    view.measure(parent.getWidth(), parent.getHeight()); 
    int height = view.getMeasuredHeight(); 
    int topOffset = parent.getHeight() - lastViewBottom - height; 
    if (topOffset < 0) topOffset = itemOffset; 

    outRect.set(itemOffset, topOffset, itemOffset, itemOffset); 
} 

private int calculateViewBottom(View view) { 
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); 
    return (int) view.getY() + view.getHeight() + params.topMargin + params.bottomMargin; 
} 
+0

Wo ist itemOffset definiert? – Remco

+0

Es ist nicht in dem Beispiel, Sie können es selbst definieren, was auch immer Ihren Bedürfnissen entspricht – Lamorak