2015-08-13 4 views
7

Ich versuche eine leere Ansicht zu machen, die den verbleibenden Platz nach einem RecyclerView farbig belegt. Ich habe mir verschiedene StackOverflow-Lösungen angesehen, aber nichts funktioniert. Ich möchte so etwas wie dies im Wesentlichen:Machen Sie die leere Ansicht, um den verbleibenden Platz nach RecyclerView aufzunehmen?

________________________ 
|      | 
|      | 
|      | 
| Recycler view  | 
|      | 
| ------------------- | 
| colored empty view | 
|      | 
|      | 
|      | 
|      | 
|      | 
_________________________ 

It should shrink as the RecyclerView grows. 

________________________ 
|      | 
|      | 
|      | 
| Recycler view  | 
|      | 
|      | 
|      | 
|      | 
|      | 
| ------------------- | 
| colored empty view | 
|      | 
|      | 
_________________________ 

Wenn jedoch die RecyclerView Wert eines Bildschirms überschreitet, sollte es keine leer sein. Hier ist, was ich bisher:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:fab="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/bla_bla_layout"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/bla_bla_recyclerview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <View 
     android:background="@color/grayBackground" 
     android:layout_gravity="bottom" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <com.melnykov.fab.FloatingActionButton 
     android:id="@+id/fab" 
     android:contentDescription="@string/add_bla" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_margin="16dp" 
     android:src="@drawable/add_bla_icon" 
     fab:fab_colorNormal="@color/primary" 
     fab:fab_colorPressed="@color/primary_pressed" 
     fab:fab_colorRipple="@color/ripple" /> 

</FrameLayout> 

EDIT Dies ist kein Duplikat der genannten Frage, und man kann das sehen, wenn Sie beiden Fragen lesen. Die Lösung für meine Frage sollte rein xml, layoutbasiert sein. Mit "leere Ansicht" meine ich nur ein farbiges Rechteck unter der vorhandenen RecyclerView, keine Textansicht, die eigentlich "leere Ansicht" sagt, wenn keine Daten im RecylerView vorhanden sind.

+2

Wenn du gehst, meine Frage zu downvote, mir bitte sagen, warum ... – Tariq

+0

mögliches Duplikat von [Wie zeige ich eine leere Ansicht mit einem RecyclerView?] (http://stackoverflow.com/questions/28217436/how-to-show-an-empty-view-with-a-cyclerview) –

+0

Das ist überhaupt nicht meine Frage. Seine Frage ist wirklich nicht einmal eine Layout-Frage. Und glauben Sie mir, ich habe mich überall umgeschaut und zahlreiche Lösungen für ähnliche Probleme ausprobiert. Wenn Sie einen finden, der funktioniert, werde ich mich freuen. – Tariq

Antwort

5

Die Recycler-Ansicht berechnet ihre Höhe zur Laufzeit und wir verwenden LinearLayoutManager, um ihre Höhe und Breite anzugeben.

Aber das Problem ist, dass LinearLayoutManager im Moment nicht wrap_content unterstützt, es verwendet immer match_parent für seine Höhe.

Sie müssen also diese LinearLayoutManager nicht android.support.v7.widget.LinearLayoutManager verwenden.

Kopie über Java-Klasse in Ihrem Paket und es verwenden, wie unten,

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, 
      LinearLayoutManager.VERTICAL, false); 
recyclerView.setLayoutManager(linearLayoutManager); 
// if it has fixed size 
recyclerView.setHasFixedSize(true); 

Ich habe es getestet und seine Arbeits wie Sie benötigen.

+0

Das funktioniert dank. Allerdings habe ich hier die einfachere erweiterte Version von LinearLayoutManger verwendet: http://stackoverflow.com/questions/26649406/nested-recycler-view-height-doesnt-wrap-its-content/28510031#28510031 berücksichtigt auch Wischen, Ziehen Sortieren und Artikeldekorationen. – Tariq

+0

P.S. Ich werde das Kopfgeld vergeben, wenn das Zeitlimit abgelaufen ist und es mich lässt. Vielen Dank! – Tariq

0

Versuchen Sie, diese

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/bla_bla_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/bla_bla_recyclerview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:entries="@array/array_sample" /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:background="@color/grayBackground" /> 

</LinearLayout> 
+0

Funktioniert nicht. Der RecyclerView nimmt nur den gesamten Platz ein. Auf jeden Fall muss ich FrameLayout wegen der FAB benutzen. – Tariq

+0

Sie könnten das 'LinearLayout' nur innerhalb eines' FrameLayout' platzieren, richtig? –

+0

Ja, ich habe das auch versucht. Es hatte den gleichen Effekt. RecyclerView nahm nur den ganzen Platz ein. – Tariq

0

Es sieht aus wie Sie mit einem RelativeLayout mit einigen align Befehle erreichen könnte.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true"/> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/recycler_view" 
      android:layout_alignParentBottom="true" 
      android:background="@color/blue"/> 

    </RelativeLayout> 

</FrameLayout> 

I umfasste die FrameLayout, weil Sie in einem anderen Kommentar erwähnt, dass Sie es mit einem FAB verwenden benötigt.

Wenn Sie dies in Android Studio laden und starten Probenbreiten-Einstellung (50dp, 150dp, 300DP ...) für die Höhe der RecyclerView Sie die View darunter sehen beginnen, ihre Höhe als auch einzustellen.

+0

Wieder funktioniert das nicht, weil das RecyclerView den gesamten Raum einnimmt. Ich habe versucht, die Höhe der Ansicht auf 0 und Gewicht auf 1, aber das hat nicht funktioniert. Dasselbe wurde mit der RecyclerView versucht, während View auf match_parent height gehalten wurde, aber das hat auch nicht funktioniert. Meine RecyclerView-Inhalte werden dynamisch festgelegt. Ich weiß nicht, was das Problem ist, aber danke für den Versuch. – Tariq

+0

Haben Sie also Artikel im RecyclerView, die den ganzen Bildschirm einnehmen? Wenn Sie mehr als genug Elemente in Ihrer Sammlung haben, um den Bildschirm zu füllen, sehe ich nicht, wie das möglich wäre. –

+0

Nein, ich teste gerade mit einem einzigen Gegenstand, der etwa ein Zehntel des Bildschirms ausfüllt. Aber wenn ich versuche zu scrollen, erzähle ich vom Overscroll-Effekt, dass der RecyclerView den ganzen Bildschirm einnimmt. – Tariq

0

Wenn Sie nur eine andere Farbe im verbleibenden Raum wünschen, stellen Sie den Hintergrund des FrameLayout auf die gewünschte Farbe ein und setzen Sie den RecyclerView Gegenstand layout Hintergrund auf weiß.

Dies führt dazu, dass der verbleibende Platz in einer separaten Farbe bleibt und die Länge der bestückten Objekte in recyclerView weiß ist, so wie Sie sie benötigen.

Wenn Sie eine andere Ansicht in den verbleibenden Raum wie ein TextView oder ein ImageView möchten, müssen Sie RecyclerView class und override die Methode, die seine Höhe berechnet, erweitern.

0

Verwenden Sie einen benutzerdefinierten LinearLayoutManager, der hoffentlich Ihr Problem löst.

Verwendung dieser Code in Ihrer Tätigkeit

RecycleView rv= (RecyclerView) rootView.findViewById(R.id.recycler_view); 
    CustomLinearLayoutManager lm= new CustomLinearLayoutManager(mActivity); 
    lm.setOrientation(LinearLayoutManager.VERTICAL); 
    lm.setHasFixedSize(true); 
    rv.setLayoutManager(lm); 

Hier ist meine CustomLinearLayoutManager

public class CustomLinearLayoutManager extends LinearLayoutManager { 

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

private int[] mMeasuredDimension = new int[2]; 

@Override 
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, 
         int widthSpec, int heightSpec) { 
    final int widthMode = View.MeasureSpec.getMode(widthSpec); 
    final int heightMode = View.MeasureSpec.getMode(heightSpec); 
    final int widthSize = View.MeasureSpec.getSize(widthSpec); 
    final int heightSize = View.MeasureSpec.getSize(heightSpec); 

    measureScrapChild(recycler, 0, 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
      mMeasuredDimension); 

    int width = mMeasuredDimension[0]; 
    int height = mMeasuredDimension[1]; 

    switch (widthMode) { 
     case View.MeasureSpec.EXACTLY: 
     case View.MeasureSpec.AT_MOST: 
      width = widthSize; 
      break; 
     case View.MeasureSpec.UNSPECIFIED: 
    } 

    switch (heightMode) { 
     case View.MeasureSpec.EXACTLY: 
     case View.MeasureSpec.AT_MOST: 
      height = heightSize; 
      break; 
     case View.MeasureSpec.UNSPECIFIED: 
    } 

    setMeasuredDimension(width, height); 
} 

private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, 
           int heightSpec, int[] measuredDimension) { 
    try { 
     View view = recycler.getViewForPosition(position); 
     if (view != null) { 
      RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); 
      int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, 
        getPaddingLeft() + getPaddingRight(), p.width); 
      int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, 
        getPaddingTop() + getPaddingBottom(), p.height); 
      view.measure(childWidthSpec, childHeightSpec); 
      measuredDimension[0] = view.getMeasuredWidth(); 
      measuredDimension[1] = view.getMeasuredHeight(); 
      recycler.recycleView(view); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

}

Verwandte Themen