0

Ich versuche, durch Erstellen einer benutzerdefinierten recyclerview Klasse mit einem AdapterDataObserver ein setEmptyView Verfahren zu implementieren, wie einige User hier beschrieben:recyclerview setEmptyView Implementierung - android

Equivalent of ListView.setEmptyView in RecyclerView

Das Problem ist, es funktioniert ist nicht für mich . Wenn die Liste voller Daten ist, kann ich die Listenelemente perfekt sehen, aber wenn die Liste leer ist, kann ich meine leere Ansicht nicht sehen.

Hier ist meine Gewohnheit recyclerview:

package bikurim.silverfix.com.bikurim.utils.general; 

import android.content.Context; 
import android.support.annotation.Nullable; 
import android.support.v7.widget.RecyclerView; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 

/** 
* Created by David on 16/07/2016. 
* 
* A custom implementation of the RecyclerView class for supporting setEmptyView() method 
* 
* @author David Lasry 
*/ 
public class FamilyRecyclerView extends RecyclerView { 

    private View emptyView; 
    private AdapterDataObserver emptyObserver = new AdapterDataObserver() { 

     @Override 
     public void onItemRangeChanged(int positionStart, int itemCount) { 
      checkIfEmpty(); 
     } 

     @Override 
     public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { 
      checkIfEmpty(); 
     } 

     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      checkIfEmpty(); 
     } 

     @Override 
     public void onItemRangeRemoved(int positionStart, int itemCount) { 
      checkIfEmpty(); 
     } 

     @Override 
     public void onChanged() { 
      checkIfEmpty(); 
     } 
    }; 
    public FamilyRecyclerView(Context context) { 
     super(context); 
    } 

    public FamilyRecyclerView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public FamilyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void setAdapter(Adapter adapter) { 
     super.setAdapter(adapter); 

     if(adapter != null) { 
      adapter.registerAdapterDataObserver(emptyObserver); 
     } 

     checkIfEmpty(); 
    } 

    public void setEmptyView(View emptyView) { 
     this.emptyView = emptyView; 
    } 

    private void checkIfEmpty() { 
     if(emptyView != null && getAdapter() != null) { 
      final boolean isEmpty = getAdapter().getItemCount() == 0; 
      emptyView.setVisibility(isEmpty ? VISIBLE : GONE); 
      setVisibility(isEmpty ? GONE : VISIBLE); 
     } 
    } 
} 

Und hier ist der Teil meiner Arbeit auf, wo ich eine Ansicht von Layout Ressource aufblasen und legen Sie es meine leer sein:

FamilyRecyclerView recyclerView = (FamilyRecyclerView) findViewById(R.id.rv); 
View emptyView = getLayoutInflater().inflate(R.layout.empty_layout, null); 
recyclerView.setEmptyView(emptyView); 

I debuggte es ein wenig und leerenView ist nicht null, was bedeutet, dass die Inflation erfolgreich ist.

Was ist das Problem hier?

Antwort

0

Es sieht so aus, als hätten Sie Ihr emptyView nicht zur Hierarchie hinzugefügt, wenn Sie es aufblasen, setzen Sie das übergeordnete Element als null und während Sie seine Sichtbarkeit ändern, wenn es in der listView ist, fügen Sie es nie als Kind von hinzu jede Ansicht. Daher existiert es, aber es wird nicht auf dem Bildschirm angezeigt. Um es zeigen Sie es mit einer übergeordneten Ansicht aufblasen können oder fügen Sie ihn in der übergeordneten Ansicht nach der Inflation:

getLayoutInflater().inflate(R.layout.empty_layout, contentView); 

oder

contentView.addView(emptyView); 

(Die contentView sind die Ansicht, dass Ihr recyclerView hält)

+0

Vielen Dank für Ihre Antwort! Ich habe mich schließlich dazu entschlossen, die leere Ansicht einfach in mein XML-Layout zu legen und den Verweis darauf in meiner Aktivität für Animationszwecke zu erhalten. –

+0

Freut mich zu hören, Sie haben es behoben! das ist auch ein gültiger Ansatz. –