RecyclerViewで空のビューを表示する方法は?


271

私は次のようにレイアウトファイル内の特別なビューを置くために使用されていますで説明ListActivityドキュメントべきデータがないときに表示します。このビューにはIDがあり"android:id/empty"ます。

<TextView
    android:id="@android:id/empty"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/no_data" />

これは新しい方法でどのように実行できるのRecyclerViewでしょうか。


2
github.com/rockerhieu/rv-adapter-statesを使用できます。空のビューだけでなく、ロードビューとエラービューもサポートされます。また、既存のアダプターのロジックを変更せずに使用できます。
Hieu Rocker 2015

20
それsetEmptyView()に対して単純な方法がないように見えるのは魅力的RecyclerViewです...
Subby

これが私の答えです。このリンクを確認してください。stackoverflow.com
a /

@サブビー、同意するが、setEmptyView()不利な点もあった。データをロードするとき、空のビューをに表示したくありませんでしたListViewが、そうしました。したがって、いくつかのロジックを実装する必要がありました。現在、私はstackoverflow.com/a/48049142/2914140を使用しています。
CoolMind、

回答:


306

が定義されているのと同じレイアウトでRecyclerView、次を追加しTextViewます。

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

<TextView
    android:id="@+id/empty_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:visibility="gone"
    android:text="@string/no_data_available" />

onCreateフィードデータセットがお使いの場合は、適切なコールバックあなたがチェックしRecyclerView、空です。データセットが空の場合、それRecyclerViewも空です。その場合、画面にメッセージが表示されます。そうでない場合は、可視性を変更します。

private RecyclerView recyclerView;
private TextView emptyView;

// ...

recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
emptyView = (TextView) rootView.findViewById(R.id.empty_view);

// ...

if (dataset.isEmpty()) {
    recyclerView.setVisibility(View.GONE);
    emptyView.setVisibility(View.VISIBLE);
}
else {
    recyclerView.setVisibility(View.VISIBLE);
    emptyView.setVisibility(View.GONE);
}

11
通常のアイテムレイアウトを表示するかアイテムなしのレイアウトを表示するかはアダプターで決定されるのに対して、リサイクラービューのレイアウトはフラグメントで膨らむため、これは私には機能しません。
JJD 2015

1
@JJDがフラグメントを使用する場合、同じことが適用されます。フラグメントビューを膨らませると、recyclerviewがあり、空のビューに使用される別のレイアウトがあります。通常、私のフラグメントでは、次のビューがあります:1)recyclerview、2)空のビュー、3)プログレスバービュー。私は通常、リストが何であれ、アダプターを渡しますが、リストのサイズに基づいて、recyclerviewを非表示にして空を表示するか、またはその逆を行います。recyclerviewに空のリストがある場合、それは何もしません。空のビューが表示されるだけです。
レイハンター

1
@stackex検証は、FragmentまたはアクティビティのonResumeのonCreateViewコールバックで行う必要があります。このようにして、ユーザーに画面が表示される直前に検証が行われ、データセット内の行数を増減して両方に対して機能します。
slellis 2015

2
@Zapnologica別の方法でそれを行うことができます。Eventbus(greenrobots EventbusやOttoなど)を使用し、データセットが変更されたときにアダプターがイベントバスにポストするようにします。フラグメントでは、アダプタがEventbus.postメソッドに渡すものに対応するパラメータを持つメソッドを作成し、それに応じてレイアウトを変更するだけです。より単純ですが、より結合されたアプローチは、アダプターにコールバックインターフェイスを作成し、アダプターの作成時にフラグメントにそれを実装させることです。
AgentKnopf、2015

2
レイアウトでは、複数のルートタグが表示されます。完全なレイアウトファイルはどのように見えますか?
powder366

192

私のプロジェクトのために私は(このソリューション作られたRecyclerViewとのsetEmptyView方法を):

public class RecyclerViewEmptySupport extends RecyclerView {
    private View emptyView;

    private AdapterDataObserver emptyObserver = new AdapterDataObserver() {


        @Override
        public void onChanged() {
            Adapter<?> adapter =  getAdapter();
            if(adapter != null && emptyView != null) {
                if(adapter.getItemCount() == 0) {
                    emptyView.setVisibility(View.VISIBLE);
                    RecyclerViewEmptySupport.this.setVisibility(View.GONE);
                }
                else {
                    emptyView.setVisibility(View.GONE);
                    RecyclerViewEmptySupport.this.setVisibility(View.VISIBLE);
                }
            }

        }
    };

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

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

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

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

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

        emptyObserver.onChanged();
    }

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

そして、あなたはRecyclerViewクラスの代わりにそれを使うべきです:

<com.maff.utils.RecyclerViewEmptySupport android:id="@+id/list1"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    />

<TextView android:id="@+id/list_empty"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Empty"
    />

そして

RecyclerViewEmptySupport list = 
    (RecyclerViewEmptySupport)rootView.findViewById(R.id.list1);
list.setLayoutManager(new LinearLayoutManager(context));
list.setEmptyView(rootView.findViewById(R.id.list_empty));

2
あなたはこの答えからまたはここからこのコードを取りましか?
スフィアン2015

@スーフィアンいいえ、その答えは見つかりませんでした。同じように見つかりました。しかし、そのコードは間違いなく私のものよりもきれいに見えます:)
maff91

2
これをFirebaseRecyclerAdapterと組み合わせてみましたが、機能しませんでした。これは、FirebaseRecyclerAdapterが(AdapterDataObserverの)onChangeを呼び出さず、代わりにonItem *メソッドを呼び出すためです。これを機能させるには、次のように追加します。
FrankkieNL 2016年

1
オブザーバーでアダプターがnullかどうかを確認するのはなぜですか?アダプターがnullの場合、オブザーバーを呼び出すことはできません。
Stimsoni 2016

16
うーん、これは単なる古典的なGoogle BSだと言わざるを得ません。空のビューを追加するだけでこれを実装する必要がありますか?cr @ psh1t SDKに含める必要があります。神酒のために!
ネオンワージ2017

62

以下は、空の状況で異なるビュータイプのカスタムアダプタのみを使用するソリューションです。

public class EventAdapter extends 
    RecyclerView.Adapter<EventAdapter.ViewHolder> {

    private static final int VIEW_TYPE_EVENT = 0;
    private static final int VIEW_TYPE_DATE = 1;
    private static final int VIEW_TYPE_EMPTY = 2;

    private ArrayList items;

    public EventAdapter(ArrayList items) {
        this.items = items;
    }

    @Override
    public int getItemCount() {
        if(items.size() == 0){
            return 1;
        }else {
            return items.size();
        }
    }

    @Override
    public int getItemViewType(int position) {
        if (items.size() == 0) {
            return VIEW_TYPE_EMPTY;
        }else{
            Object item = items.get(position);
            if (item instanceof Event) {
                return VIEW_TYPE_EVENT;
            } else {
                return VIEW_TYPE_DATE;
            }
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        ViewHolder vh;
        if (viewType == VIEW_TYPE_EVENT) {
            v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.item_event, parent, false);
            vh = new ViewHolderEvent(v);
        } else if (viewType == VIEW_TYPE_DATE) {
            v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.item_event_date, parent, false);
            vh = new ViewHolderDate(v);
        } else {
            v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.item_event_empty, parent, false);
            vh = new ViewHolder(v);
        }

        return vh;
    }

    @Override
    public void onBindViewHolder(EventAdapter.ViewHolder viewHolder, 
                                 final int position) {
        int viewType = getItemViewType(position);
        if (viewType == VIEW_TYPE_EVENT) {
            //...
        } else if (viewType == VIEW_TYPE_DATE) {
            //...
        } else if (viewType == VIEW_TYPE_EMPTY) {
            //...
        }
    }

    public static class ViewHolder extends ParentViewHolder {
        public ViewHolder(View v) {
            super(v);
        }
    }

    public static class ViewHolderDate extends ViewHolder {

        public ViewHolderDate(View v) {
            super(v);
        }
    }

    public static class ViewHolderEvent extends ViewHolder {

        public ViewHolderEvent(View v) {
            super(v);
        }
    }

}

3
@ sfk92fksdfエラーが発生しやすいのはなぜですか?これは、recyclerviewで複数のビュータイプを処理する方法です
MSpeed

@billynomates、onelinerであるgetItemCount()はずですが、ここにはifいくつかの隠されたロジックがある自明ではありません。このロジックも不自然に表示されgetItemViewType、神は他の場所を知っています
Alexey Andronov 2017

3
1行である必要はありません。複数のビュータイプがある場合、これがその方法です。
MSpeed

@ sfk92fksdf隠しロジックとはどういう意味ですか?コードはすぐそこにあります▲
radu122

1
私の意見では、この答えは受け入れられる答えでなければなりません。これは、複数のビュータイプを処理する方法です
Ivo Beckers

45

ViewSwitcherを使用しています

<ViewSwitcher
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/switcher"
    >

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

    <TextView android:id="@+id/text_empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/list_empty"
        android:gravity="center"
        />

</ViewSwitcher>

コードでは、カーソル/データセットをチェックしてビューを切り替えます。

void showItems(Cursor items) {
    if (items.size() > 0) {

        mAdapter.switchCursor(items);

        if (R.id.list == mListSwitcher.getNextView().getId()) {
            mListSwitcher.showNext();
        }
    } else if (R.id.text_empty == mListSwitcher.getNextView().getId()) {
        mListSwitcher.showNext();
    }
}

また、必要に応じて、数行のコードでアニメーションを設定できます

mListSwitcher.setInAnimation(slide_in_left);
mListSwitcher.setOutAnimation(slide_out_right);

それは本当に斬新です
Zhang Xiang

きれいな溶液。
Ojonugwa Jude Ochalifu

30

ケビンの答えは完全ではないので。
使用する場合、これは、より正しい答えであるRecyclerAdapternotifyItemInsertednotifyItemRemoved、更新データセットに。以下に追加された別のユーザーのKotlinバージョンを参照してください。

Java:

mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {

    @Override
    public void onChanged() {
        super.onChanged();
        checkEmpty();
    }

    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        super.onItemRangeInserted(positionStart, itemCount);
        checkEmpty();
    }

    @Override
    public void onItemRangeRemoved(int positionStart, int itemCount) {
        super.onItemRangeRemoved(positionStart, itemCount);
        checkEmpty();
    }

    void checkEmpty() {
        mEmptyView.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
    }
});

コトリン

adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
    override fun onChanged() {
        super.onChanged()
        checkEmpty()
    }

    override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
        super.onItemRangeInserted(positionStart, itemCount)
        checkEmpty()
    }

    override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
        super.onItemRangeRemoved(positionStart, itemCount)
        checkEmpty()
    }

    fun checkEmpty() {
        empty_view.visibility = (if (adapter.itemCount == 0) View.VISIBLE else View.GONE)
    }
})

2
これは素晴らしいソリューションです。kotlinバージョンを含む編集を提案しています。
jungledev

これは良いように見えますが、swapAdapter()またはsetAdapter()を2回以上呼び出すと機能しない可能性があります。
Glaucus

私は最もエレガントなソリューションだと思います!
アンドロイド愛好家

すごい仕事。ラベルを表示するときにRecyclerViewを非表示にすることを忘れないでください
MrG

18

RVEmptyObserver

カスタムを使用する代わりにRecyclerView、拡張は、リストに項目がないときに表示されるAdapterDataObserverカスタムViewを設定できる、より簡単なソリューションです。

使用例:

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

クラス:

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

私はあなたが呼び出していない場合、それはより速く実行されることを信じているcheckIfEmpty()onChanged()してonItemRangeInserted()
Geekarist

私は同意します(そしてそれは私が個人的にしたことです)が、これはこの問題に直面している人々の出発点にすぎません。
Sheharyar 2017年

9

アダプタのgetItemViewType要素で0の要素があるかどうかを確認し、0の場合は別のviewTypeを返します。

次にonCreateViewHolder、viewTypeが以前に返されたものかどうかを確認し、別のビューを拡張します。この場合、そのTextViewを含むレイアウトファイル

編集

それでも機能しない場合は、次のようにプログラムでビューのサイズを設定することをお勧めします。

Point size = new Point();
((WindowManager)itemView.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(size);

そして、ビュー呼び出しを膨らませると、次のようになります。

inflatedView.getLayoutParams().height = size.y;
inflatedView.getLayoutParams().width = size.x;

いいですね。しかし、私はに得ることはありませんonCreateViewHolder、私のデータセットがあるときnull、私は返す必要があるためか、空0getItemCount
JJD 2015

次に、nullの場合は1を返します:)
Pedro Oliveira、

やや機能します。ありがとうございました。-マイナーな詳細は、リサイクラービューで空のリストアイテムを垂直方向の中央に配置できないことです。画面上部のテキストビューの滞在にもかかわらず、私は設定android:layout_gravity="center"android:layout_height="match_parent"親リサイクルビューのため。
JJD 2015

使用している行のレイアウトによって異なります。高さはmatch_parentにする必要があります。それでも機能しない場合は、グローバルレイアウトリスナーを追加し、そのレイアウトパラメーターを画面と同じ高さと幅に設定します。
Pedro Oliveira

すべてのコンテナ(アクティビティ、フラグメント、線形レイアウト、リサイクラービュー、テキストビュー)はに設定されandroid:layout_height="match_parent"ます。行は画面の高さまで拡大しませんが。
JJD 2015

8

空のビューの表示、ビューの再試行(APIの読み込みに失敗した場合)、および読み込みの進行状況の私のクラスは次のとおりです RecyclerView

public class RecyclerViewEmptyRetryGroup extends RelativeLayout {
    private RecyclerView mRecyclerView;
    private LinearLayout mEmptyView;
    private LinearLayout mRetryView;
    private ProgressBar mProgressBar;
    private OnRetryClick mOnRetryClick;

    public RecyclerViewEmptyRetryGroup(Context context) {
        this(context, null);
    }

    public RecyclerViewEmptyRetryGroup(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RecyclerViewEmptyRetryGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void onViewAdded(View child) {
        super.onViewAdded(child);
        if (child.getId() == R.id.recyclerView) {
            mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            return;
        }
        if (child.getId() == R.id.layout_empty) {
            mEmptyView = (LinearLayout) findViewById(R.id.layout_empty);
            return;
        }
        if (child.getId() == R.id.layout_retry) {
            mRetryView = (LinearLayout) findViewById(R.id.layout_retry);
            mRetryView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mRetryView.setVisibility(View.GONE);
                    mOnRetryClick.onRetry();
                }
            });
            return;
        }
        if (child.getId() == R.id.progress_bar) {
            mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
        }
    }

    public void loading() {
        mRetryView.setVisibility(View.GONE);
        mEmptyView.setVisibility(View.GONE);
        mProgressBar.setVisibility(View.VISIBLE);
    }

    public void empty() {
        mEmptyView.setVisibility(View.VISIBLE);
        mRetryView.setVisibility(View.GONE);
        mProgressBar.setVisibility(View.GONE);
    }

    public void retry() {
        mRetryView.setVisibility(View.VISIBLE);
        mEmptyView.setVisibility(View.GONE);
        mProgressBar.setVisibility(View.GONE);
    }

    public void success() {
        mRetryView.setVisibility(View.GONE);
        mEmptyView.setVisibility(View.GONE);
        mProgressBar.setVisibility(View.GONE);
    }

    public RecyclerView getRecyclerView() {
        return mRecyclerView;
    }

    public void setOnRetryClick(OnRetryClick onRetryClick) {
        mOnRetryClick = onRetryClick;
    }

    public interface OnRetryClick {
        void onRetry();
    }
}

activity_xml

<...RecyclerViewEmptyRetryGroup
        android:id="@+id/recyclerViewEmptyRetryGroup">

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

        <LinearLayout
            android:id="@+id/layout_empty">
            ...
        </LinearLayout>

        <LinearLayout
            android:id="@+id/layout_retry">
            ...
        </LinearLayout>

        <ProgressBar
            android:id="@+id/progress_bar"/>

</...RecyclerViewEmptyRetryGroup>

ここに画像の説明を入力してください

ソースはこちらですhttps://github.com/PhanVanLinh/AndroidRecyclerViewWithLoadingEmptyAndRetry


7

カスタムRecyclerViewでAdapterDataObserverを使用する

コトリン:

RecyclerViewEnum.kt

enum class RecyclerViewEnum {
    LOADING,
    NORMAL,
    EMPTY_STATE
}

RecyclerViewEmptyLoadingSupport.kt

class RecyclerViewEmptyLoadingSupport : RecyclerView {

    var stateView: RecyclerViewEnum? = RecyclerViewEnum.LOADING
        set(value) {
            field = value
            setState()
        }
    var emptyStateView: View? = null
    var loadingStateView: View? = null


    constructor(context: Context) : super(context) {}

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}


    private val dataObserver = object : AdapterDataObserver() {
        override fun onChanged() {
            onChangeState()
        }

        override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
            super.onItemRangeRemoved(positionStart, itemCount)
            onChangeState()
        }

        override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
            super.onItemRangeInserted(positionStart, itemCount)
            onChangeState()
        }
    }


    override fun setAdapter(adapter: RecyclerView.Adapter<*>?) {
        super.setAdapter(adapter)
        adapter?.registerAdapterDataObserver(dataObserver)
        dataObserver.onChanged()
    }


    fun onChangeState() {
        if (adapter?.itemCount == 0) {
            emptyStateView?.visibility = View.VISIBLE
            loadingStateView?.visibility = View.GONE
            this@RecyclerViewEmptyLoadingSupport.visibility = View.GONE
        } else {
            emptyStateView?.visibility = View.GONE
            loadingStateView?.visibility = View.GONE
            this@RecyclerViewEmptyLoadingSupport.visibility = View.VISIBLE
        }
    }

    private fun setState() {

        when (this.stateView) {
            RecyclerViewEnum.LOADING -> {
                loadingStateView?.visibility = View.VISIBLE
                this@RecyclerViewEmptyLoadingSupport.visibility = View.GONE
                emptyStateView?.visibility = View.GONE
            }

            RecyclerViewEnum.NORMAL -> {
                loadingStateView?.visibility = View.GONE
                this@RecyclerViewEmptyLoadingSupport.visibility = View.VISIBLE
                emptyStateView?.visibility = View.GONE
            }
            RecyclerViewEnum.EMPTY_STATE -> {
                loadingStateView?.visibility = View.GONE
                this@RecyclerViewEmptyLoadingSupport.visibility = View.GONE
                emptyStateView?.visibility = View.VISIBLE
            }
        }
    }
}

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/emptyView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:id="@+id/emptyLabelTv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="empty" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/loadingView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:gravity="center"
        android:orientation="vertical">

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:layout_gravity="center"
            android:indeterminate="true"
            android:theme="@style/progressBarBlue" />
    </LinearLayout>

    <com.peeyade.components.recyclerView.RecyclerViewEmptyLoadingSupport
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

活動ではこのように使用します:

recyclerView?.apply {
        layoutManager = GridLayoutManager(context, 2)
        emptyStateView = emptyView
        loadingStateView = loadingView
        adapter = adapterGrid
    }

    // you can set LoadingView or emptyView manual
    recyclerView.stateView = RecyclerViewEnum.EMPTY_STATE
    recyclerView.stateView = RecyclerViewEnum.LOADING

1
そのソリューションを使用する場合は、メモリ割り当てサイズが増加しているため、列挙型の使用では不十分であることに注意してください。コンテキストに応じて、適切な注釈StringDefまたはIntDef注釈を付けた整数または文字列を使用してください
Andrii Artamonov

2

私は追加しRecyclerView、代わりImageViewRelativeLayout

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

    <ImageView
        android:id="@+id/no_active_jobs"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_active_jobs" />

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

そして次にAdapter

@Override
public int getItemCount() {
    if (mOrders.size() == 0) {
        mRecyclerView.setVisibility(View.INVISIBLE);
    } else {
        mRecyclerView.setVisibility(View.VISIBLE);
    }
    return mOrders.size();
}

7
mRecyclerView内部に到達する方法Adapter
Basheer AL-MOMANI

2
アダプターを特定のアクティビティーに関連付けることは、良い設計パターンではありません。これは、インタフェースを介してそれを行う方が良いでしょう
RUX

1
また、これによりレイアウトのオーバードローが発生しますが、これは推奨されておらず、パフォーマンスの問題を引き起こす可能性があります。詳細については、youtube.com / watch?v = T52v50r
Felipe Conde

1

もう1つの方法は、addOnChildAttachStateChangeListenerでの表示/非表示の子ビューを処理するを使用することRecyclerViewです。

recyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
            @Override
            public void onChildViewAttachedToWindow(@NonNull View view) {
                forEmptyTextView.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onChildViewDetachedFromWindow(@NonNull View view) {
                forEmptyTextView.setVisibility(View.VISIBLE);
            }
        });

0

FirebaseRecyclerAdapterで作業している場合に備えて、この投稿は魅力として機能しますhttps://stackoverflow.com/a/39058636/6507009


7
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
Anh Pham 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.