RecyclerView'da ListView.setEmptyView'a eşdeğer


Yanıtlar:


69

Yeni veri bağlama özelliği ile bunu doğrudan mizanpajınızda da gerçekleştirebilirsiniz:

<TextView
   android:text="No data to display."
   android:visibility="@{dataset.size() > 0 ? View.GONE : View.VISIBLE}" />

Bu durumda, XML'inizin veri bölümüne bir değişken ve içe aktarma eklemeniz yeterlidir:

<data>
<import type="android.view.View"/>
<variable
    name="dataset"
    type="java.util.List&lt;java.lang.String&gt;"
    />
</data>

6
Veri bağlama yaklaşımını vurgulamak için yukarıdaki örnek basitleştirilmiştir. Veri bağlama çok esnektir. Sen elbette alabiliriz Adapterveri kümesi yerine ve kullanmak getItemCount()bir dahilinde veya sargının her şeyi ViewModelve seti android:visibilityiçin viewModel.getEmptyViewVisibility().
André Diermann

5
Bu, daha yüksek
Ed George

1
@javmarina Hayır, benim için düzen güncellenmeye devam etmedi. Adaptörüm 0 boyutuyla başlarsa ve daha sonra veri kümesi büyürse, düzen istendiği gibi güncellenmeyecektir. Görünüşe göre veri bağlama benim için çalışmayacak. :-(
meisteg

4
Adaptör dinamik olarak büyüyor veya sıfıra küçülse bile bu güncellenecek mi? Bundan şüpheliyim.
david

1
@ a11n Liste 0'a küçüldüğünde veya veri aldığında düzeni güncellemez, listede her değişiklik yaptığımızda sınıftan bağlamanın değerini belirlememiz gerekir, düzeni kendi başına güncellemenin bir yolu var mı?
Om Infowave Developers

116

İşte @dragon born's'a benzer, ancak daha eksiksiz bir sınıf. Dayanarak bu özünden .

public class EmptyRecyclerView extends RecyclerView {
    private View emptyView;
    final private AdapterDataObserver observer = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            checkIfEmpty();
        }

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

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

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

    public EmptyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

    @Override
    public void setAdapter(Adapter adapter) {
        final Adapter oldAdapter = getAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }

        checkIfEmpty();
    }

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

bu dersi nasıl kullanabileceğimi açıklar mısınız lütfen?
Ololoking

Tıpkı RecyclerView ile yaptığınız gibi setEmptyView, boş görünümü ne zaman tanımlamak istediğinizde çağırabileceğiniz yöntemi ekler . Açık ListView.setEmptyViewdeğilse belgelere bakın, aynı fikirdir.
Marc Plano-Lesay

5
Google Örneklerinden benzer bir uygulama: github.com/googlesamples/android-XYZTouristAttractions/blob/…
jase

2
Harika bir çözüm ama sınıf adı garip =)
Шах

1
@AJW Sanırım bu çoğunlukla neye ulaşmak istediğinizle ilgili. İki uygulama arasındaki fark gerçekten çok azdır ve bir adaptör kurulur kurulmaz geriye hiçbir şey kalmaz. Adaptörü değiştirmezseniz (büyük olasılıkla durum budur), hiçbir fark yoktur.
Marc Plano-Lesay

26

Bu bağlantıda sağlanan çözüm mükemmel görünüyor. Ne zaman emptyView gösterileceğini belirlemek için viewType kullanır. Özel RecyclerView oluşturmaya gerek yok

Yukarıdaki bağlantıdan kod eklemek:

package com.example.androidsampleproject;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class RecyclerViewActivity extends Activity {

RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recycler_view);
    recyclerView = (RecyclerView) findViewById(R.id.myList);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(new MyAdapter());
}


private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<String> dataList = new ArrayList<String>();

    public class EmptyViewHolder extends RecyclerView.ViewHolder {
        public EmptyViewHolder(View itemView) {
            super(itemView);
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView data;

        public ViewHolder(View v) {
            super(v);
            data = (TextView) v.findViewById(R.id.data_view);
        }
    }

    @Override
    public int getItemCount() {
        return dataList.size() > 0 ? dataList.size() : 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (dataList.size() == 0) {
            return EMPTY_VIEW;
        }
        return super.getItemViewType(position);
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder vho, final int pos) {
        if (vho instanceof ViewHolder) {
            ViewHolder vh = (ViewHolder) vho;
            String pi = dataList.get(pos);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;

        if (viewType == EMPTY_VIEW) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_view, parent, false);
            EmptyViewHolder evh = new EmptyViewHolder(v);
            return evh;
        }

        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.data_row, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    private static final int EMPTY_VIEW = 10;
}

}

6
RecyclerView'i genişletmenin bundan daha uygun bir çözüm olduğunu düşünüyorum çünkü genellikle çok sayıda geri dönüşüm adaptörüm var ve her birine bu tür bir mantık eklemekten kaçınmak istiyorum.
Gunhan

Bu, birçok geri dönüşüm adaptörünü kullanırken @ Gunhan mantıklı geliyor. Ayrıca genel şeyler için özelleştirilmiş tek bir
BaseAdapter

2
Tek bir adaptörünüz ve bir geri dönüşümcü görünümünüz olsa bile, bu adaptörün sorumluluğu değildir. Adaptör, öğelerin yokluğunu değil öğeleri sunmak için buradadır.
Marc Plano-Lesay

@Kernald Kullanım durumunuza bağlıdır. Şahsen ben Sudhasri'nin yaptığı gibi çok daha temiz olduğunu düşünüyorum. Özellikle, "Burada ürün yok, alışverişe git!" Gibi hiçbir öğe bulunmadığında farklı bir görünüm göstermek istiyorsanız. ya da bunun gibi şeyler
AgentKnopf

@Zainodis Dediğin gibi bu farklı bir görüş. O var olmayan recyclerview öğeleri göstermektir adaptörünün responsabilityi, başka bir şey. Teknik açıdan hem çözümün işe yaradığını hem de hemen hemen eşit olduğunu kabul ediyorum. Ancak adaptörün öğeleri bu gibi görünümleri gösterecek şekilde yapılmamıştır .
Marc Plano-Lesay

10

Şunun gibi basit bir çözümü tercih ederim:

RecyclerView'ınızı bir TextView veya başka bir görünümle bir FrameLayout veya RelativeLayout içinde, görünürlük GONE ile boş veri mesajı gösteren başka bir görünümde bulundurun ve ardından adaptör sınıfında, mantığı uygulayın

Burada, mesaj veri olmayan bir TextView var

@Override
public int getItemCount() {
    textViewNoData.setVisibility(data.size() > 0 ? View.GONE : View.VISIBLE);
    return data.size();
}

3

Deneyin RVEmptyObserver:

Bu bir bir uygulamasıdır var AdapterDataObserversadece bir ayarlamanızı sağlar Viewşunlara ait varsayılan boş düzen olarak RecylerView. Bu şekilde, bir gelenek kullanmak RecyclerViewve hayatınızı zorlaştırmak yerine, mevcut kodunuzla kolayca kullanabilirsiniz:


Örnek Kullanım:

RVEmptyObserver observer = new RVEmptyObserver(recyclerView, emptyView)
rvAdapter.registerAdapterDataObserver(observer);

Sen edebilir kodu görmek ve örnek kullanımlarını burada gerçek bir app.


Sınıf:

public class RVEmptyObserver extends RecyclerView.AdapterDataObserver {
    private View emptyView;
    private RecyclerView recyclerView;

    public RVEmptyObserver(RecyclerView rv, View ev) {
        this.recyclerView = rv;
        this.emptyView    = ev;
        checkIfEmpty();
    }

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

    public void onChanged() { checkIfEmpty(); }
    public void onItemRangeInserted(int positionStart, int itemCount) { checkIfEmpty(); }
    public void onItemRangeRemoved(int positionStart, int itemCount) { checkIfEmpty(); }
}

2

Https://gist.github.com/adelnizamutdinov/31c8f054d1af4588dc5c tabanlı sürümüm

public class EmptyRecyclerView extends RecyclerView {
    @Nullable
    private View emptyView;

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

    public EmptyRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

    private final AdapterDataObserver observer = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            checkIfEmpty();
        }

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

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

    @Override
    public void setAdapter(@Nullable Adapter adapter) {
        final Adapter oldAdapter = getAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }
        checkIfEmpty();
    }

    @Override
    public void setVisibility(int visibility) {
        super.setVisibility(visibility);
        if (null != emptyView && (visibility == GONE || visibility == INVISIBLE)) {
            emptyView.setVisibility(GONE);
        } else {
            checkIfEmpty();
        }
    }

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

3
Yeniden uygulamak setVisibilityda iyi bir fikir .
Marc Plano-Lesay

2

Bu işlevi Recycler'da uygulamayı tercih ederim.

Geçersiz kılınan getItemCount yönteminizde, oraya boş çek kodları enjekte edin:

@Override
public int getItemCount() {
    if(data.size() == 0) listIsEmtpy();
    return data.size();
}

3
Adaptörün sorumluluğu değil. Adaptör, öğelerin yokluğunu değil öğeleri sunmak için buradadır.
Marc Plano-Lesay

@Kernald Bu bizim kodumuz ve kendi yöntemimiz, onu nasıl özelleştirip kullanıyoruz.
Lalit Poptani

@LalitPoptani tabii. Ancak bu, insanların cevapları aradıkları bir soru-cevap web sitesidir, çoğu zaman "kopya kısayolu nedir?" Çözümün anlamsal olarak yanlış olduğunu belirtmek (ayrıca "haklara" sahip olduğunuzda) gerçekten işe yaramaz değil…
Marc Plano-Lesay

@Kernald Bence bu çözüm hepsinden daha basit ve aynı zamanda iyi bir çözüm, çünkü adaptör her bildirildiğinde bu çağrılacak ve verilerin boyutunu kontrol etmek için kullanılabilir!
Lalit Poptani

2
@ MarcPlano-Lesay doğru. Bu cevap eksiktir çünkü maddeler doldurulduktan sonra boş görünümün görünmez olması gerektiği durumu ele almaz. Bu parçayı uyguladıktan sonra, bu çözüm verimsiz hale gelir çünkü adaptör her öğe sayısını sorguladığında, setVisibility()çağrılır. Elbette telafi etmek için bazı işaretler ekleyebilirsiniz, ancak bu daha karmaşık hale geldiği zamandır.
2016

2

Yükleme durumu, hata durumu gibi daha fazla durumu desteklemek istiyorsanız, https://github.com/rockerhieu/rv-adapter-states kontrol edebilirsiniz . Aksi takdirde, boş görünümü desteklemek RecyclerViewAdapterWrapper, ( https://github.com/rockerhieu/rv-adapter ) adresinden kolayca uygulanabilir . Bu yaklaşımın temel avantajı, mevcut adaptörün mantığını değiştirmeden boş görünümü kolayca destekleyebilmenizdir:

public class StatesRecyclerViewAdapter extends RecyclerViewAdapterWrapper {
    private final View vEmptyView;

    @IntDef({STATE_NORMAL, STATE_EMPTY})
    @Retention(RetentionPolicy.SOURCE)
    public @interface State {
    }

    public static final int STATE_NORMAL = 0;
    public static final int STATE_EMPTY = 2;

    public static final int TYPE_EMPTY = 1001;

    @State
    private int state = STATE_NORMAL;

    public StatesRecyclerViewAdapter(@NonNull RecyclerView.Adapter wrapped, @Nullable View emptyView) {
        super(wrapped);
        this.vEmptyView = emptyView;
    }

    @State
    public int getState() {
        return state;
    }

    public void setState(@State int state) {
        this.state = state;
        getWrappedAdapter().notifyDataSetChanged();
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        switch (state) {
            case STATE_EMPTY:
                return 1;
        }
        return super.getItemCount();
    }

    @Override
    public int getItemViewType(int position) {
        switch (state) {
            case STATE_EMPTY:
                return TYPE_EMPTY;
        }
        return super.getItemViewType(position);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case TYPE_EMPTY:
                return new SimpleViewHolder(vEmptyView);
        }
        return super.onCreateViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (state) {
            case STATE_EMPTY:
                onBindEmptyViewHolder(holder, position);
                break;
            default:
                super.onBindViewHolder(holder, position);
                break;
        }
    }

    public void onBindEmptyViewHolder(RecyclerView.ViewHolder holder, int position) {
    }

    public static class SimpleViewHolder extends RecyclerView.ViewHolder {
        public SimpleViewHolder(View itemView) {
            super(itemView);
        }
    }
}

Kullanım:

Adapter adapter = originalAdapter();
StatesRecyclerViewAdapter statesRecyclerViewAdapter = new StatesRecyclerViewAdapter(adapter, emptyView);
rv.setAdapter(endlessRecyclerViewAdapter);

// Change the states of the adapter
statesRecyclerViewAdapter.setState(StatesRecyclerViewAdapter.STATE_EMPTY);
statesRecyclerViewAdapter.setState(StatesRecyclerViewAdapter.STATE_NORMAL);

Kodunuzu benzer bir çözüm için temel olarak kullandım. Teşekkürler!
Albert Vila Calvo

2

Bunu düzelttim:
layout_recyclerview_with_emptytext.xml dosyası oluşturuldu.
EmptyViewRecyclerView.java
--------- oluşturuldu

EmptyViewRecyclerView emptyRecyclerView = (EmptyViewRecyclerView) findViewById (R.id.emptyRecyclerViewLayout);
emptyRecyclerView.addAdapter (mPrayerCollectionRecyclerViewAdapter, "Seçili kategori için dua yok.");

layout_recyclerview_with_emptytext.xml dosyası

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

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

<com.ninestars.views.CustomFontTextView android:id="@+id/recyclerViewEmptyTextView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Empty Text"
    android:layout_gravity="center"
    android:gravity="center"
    android:textStyle="bold"
    />

    </merge>


EmptyViewRecyclerView.java

public class EmptyViewRecyclerView extends ViewSwitcher {
private RecyclerView mRecyclerView;
private CustomFontTextView mRecyclerViewExptyTextView;

public EmptyViewRecyclerView(Context context) {
    super(context);
    initView(context);
}

public EmptyViewRecyclerView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context);
}


private void initView(Context context) {
    LayoutInflater.from(context).inflate(R.layout.layout_recyclerview_with_emptytext, this, true);
    mRecyclerViewExptyTextView = (CustomFontTextView) findViewById(R.id.recyclerViewEmptyTextView);
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
}

public void addAdapter(final RecyclerView.Adapter<?> adapter) {
    mRecyclerView.setAdapter(adapter);
    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            if(adapter.getItemCount() > 0) {
                if (R.id.recyclerView == getNextView().getId()) {
                    showNext();
                }
            } else {
                if (R.id.recyclerViewEmptyTextView == getNextView().getId()) {
                    showNext();
                }
            }
        }
    });
}

public void addAdapter(final RecyclerView.Adapter<?> adapter, String emptyTextMsg) {
    addAdapter(adapter);
    setEmptyText(emptyTextMsg);
}

public RecyclerView getRecyclerView() {
    return mRecyclerView;
}

public void setEmptyText(String emptyTextMsg) {
    mRecyclerViewExptyTextView.setText(emptyTextMsg);
}

}

1
public class EmptyRecyclerView extends RecyclerView {
  @Nullable View emptyView;

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

  public EmptyRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); }

  public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  void checkIfEmpty() {
    if (emptyView != null) {
      emptyView.setVisibility(getAdapter().getItemCount() > 0 ? GONE : VISIBLE);
    }
  }

  final @NotNull AdapterDataObserver observer = new AdapterDataObserver() {
    @Override public void onChanged() {
      super.onChanged();
      checkIfEmpty();
    }
  };

  @Override public void setAdapter(@Nullable Adapter adapter) {
    final Adapter oldAdapter = getAdapter();
    if (oldAdapter != null) {
      oldAdapter.unregisterAdapterDataObserver(observer);
    }
    super.setAdapter(adapter);
    if (adapter != null) {
      adapter.registerAdapterDataObserver(observer);
    }
  }

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

bunun gibi bir şey yardımcı olabilir


2
Bu eksik. Muhtemelen RecyclerViewgöründüğünde emptyView(ve tam tersi) gizlemeniz gerekecek . Ayrıca çağrı gerekir checkIfEmpty()üzerinde onItemRangeInserted()ve onItemRangeRemoved(). Oh, ve kaynağınızdan alıntı yapabilirdiniz: gist.github.com/adelnizamutdinov/31c8f054d1af4588dc5c
Marc Plano-Lesay


1

Metni RecyclerViewboş olduğu zaman boyayabilirsiniz . Aşağıdaki gümrük alt sınıf destekler empty, failed, loading, ve offlinemodlar. Başarılı bir derleme recyclerView_stateTextiçin kaynaklarınıza renk katın.

/**
 * {@code RecyclerView} that supports loading and empty states.
 */
public final class SupportRecyclerView extends RecyclerView
{
    public enum State
    {
        NORMAL,
        LOADING,
        EMPTY,
        FAILED,
        OFFLINE
    }

    public SupportRecyclerView(@NonNull Context context)
    {
        super(context);

        setUp(context);
    }

    public SupportRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs)
    {
        super(context, attrs);

        setUp(context);
    }

    public SupportRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);

        setUp(context);
    }

    private Paint textPaint;
    private Rect textBounds;
    private PointF textOrigin;

    private void setUp(Context c)
    {
        textPaint = new Paint();
        textPaint.setAntiAlias(true);
        textPaint.setColor(ContextCompat.getColor(c, R.color.recyclerView_stateText));

        textBounds = new Rect();
        textOrigin = new PointF();
    }

    private State state;

    public State state()
    {
        return state;
    }

    public void setState(State newState)
    {
        state = newState;
        calculateLayout(getWidth(), getHeight());
        invalidate();
    }

    private String loadingText = "Loading...";

    public void setLoadingText(@StringRes int resId)
    {
        loadingText = getResources().getString(resId);
    }

    private String emptyText = "Empty";

    public void setEmptyText(@StringRes int resId)
    {
        emptyText = getResources().getString(resId);
    }

    private String failedText = "Failed";

    public void setFailedText(@StringRes int resId)
    {
        failedText = getResources().getString(resId);
    }

    private String offlineText = "Offline";

    public void setOfflineText(@StringRes int resId)
    {
        offlineText = getResources().getString(resId);
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        String s = stringForCurrentState();
        if (s == null)
            return;

        canvas.drawText(s, textOrigin.x, textOrigin.y, textPaint);
    }

    private void calculateLayout(int w, int h)
    {
        String s = stringForCurrentState();
        if (s == null)
            return;

        textPaint.setTextSize(.1f * w);
        textPaint.getTextBounds(s, 0, s.length(), textBounds);

        textOrigin.set(
         w / 2f - textBounds.width() / 2f - textBounds.left,
         h / 2f - textBounds.height() / 2f - textBounds.top);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);

        calculateLayout(w, h);
    }

    private String stringForCurrentState()
    {
        if (state == State.EMPTY)
            return emptyText;
        else if (state == State.LOADING)
            return loadingText;
        else if (state == State.FAILED)
            return failedText;
        else if (state == State.OFFLINE)
            return offlineText;
        else
            return null;
    }
}

1

Benim bakış açıma göre, boş bir Görünüm yapmanın en kolay yolu, arka plan olarak şişirmek istediğiniz düzene sahip yeni boş RecyclerView oluşturmaktır. Ve bu boş Bağdaştırıcı, veri kümesi boyutunuzu kontrol ettiğinizde ayarlanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.