RecyclerView의 ListView.setEmptyView와 동일


답변:


69

새로운 데이터 바인딩 기능을 사용 하면 레이아웃에서 직접이 작업을 수행 할 수도 있습니다.

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

이 경우 XML의 데이터 섹션에 변수와 가져 오기를 추가하기 만하면됩니다.

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

6
위의 예는 데이터 바인딩 접근 방식을 강조하기 위해 단순화되었습니다. 데이터 바인딩은 매우 유연합니다. 물론 Adapter데이터 세트 대신을 가져 와서 사용 getItemCount()하거나 a 내에서 모든 것을 래핑 ViewModel하고로 설정할 android:visibilityviewModel.getEmptyViewVisibility()있습니다.
André Diermann 2015-08-27

4
이것은 높은 투표를해야한다, 그것은 기능을 데이터 바인딩의 훌륭한 예입니다
에드 조지

1
@javmarina 아니요, 레이아웃이 계속 업데이트되지 않았습니다. 내 어댑터가 크기 0으로 시작하고 나중에 데이터 세트가 커지면 레이아웃이 원하는대로 업데이트되지 않습니다. 데이터 바인딩이 작동하지 않는 것 같습니다. :-(
meisteg

3
어댑터가 동적으로 증가하거나 0으로 축소되는 경우에도 업데이트됩니까? 의심 스럽다.
데이비드

1
@ a11n 목록이 0으로 축소되거나 데이터를 가져올 때 레이아웃을 업데이트하지 않습니다. 목록을 변경할 때마다 클래스에서 바인딩에 값을 설정해야합니다. 레이아웃 자체를 업데이트 할 방법이 있습니까?
옴 Infowave 개발자

114

@dragon born과 비슷한 클래스가 있지만 더 완벽합니다. 이 요점을 기반으로 합니다 .

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

이 수업을 어떻게 사용할 수 있는지 설명해 주시겠습니까?
Ololoking 2015-04-02

RecyclerView로하는 것과 똑같이 setEmptyView빈 뷰를 정의하고 싶을 때마다 호출 할 수 있는 메서드 만 추가합니다 . ListView.setEmptyView명확하지 않은 경우 문서를 참조하십시오 . 동일한 아이디어입니다.
Marc Plano-Lesay 2015-04-03


2
멋진 솔루션이지만 클래스 이름이 이상합니다 =)
Шах

1
@AJW 나는 그것이 대부분 당신이 성취하고 싶은 문제의 문제라고 생각합니다. 두 구현 간의 차이는 매우 사소하며 어댑터가 설정 되 자마자 남은 것이 없습니다. 어댑터를 변경하지 않으면 (대부분의 경우) 차이가 없습니다.
마크 플라 노 - Lesay

26

이 링크에 제공된 솔루션 은 완벽 해 보입니다. viewType을 사용하여 emptyView를 표시 할시기를 식별합니다. 사용자 지정 RecyclerView를 만들 필요가 없습니다.

위 링크에서 코드 추가 :

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를 확장하는 것이 이보다 더 적절한 솔루션이라고 생각합니다. 일반적으로 리사이클 러 어댑터가 많고 모든 어댑터에 이런 종류의 논리를 추가하는 것을 피하고 싶기 때문입니다.
Gunhan

많은 재활용 어댑터를 사용할 때 @Gunhan이 의미가 있습니다. 당신은 또한 모두 일반적인 것들에 대한 사용자 정의 단일 BaseAdapter 확장을 시도 할 수 있습니다
Sudhasri

2
하나의 어댑터와 하나의 리사이클 러 뷰만 있어도 어댑터의 책임은 아닙니다. 어댑터는 항목이없는 것이 아니라 항목을 제시하기 위해 여기에 있습니다.
Marc Plano-Lesay 2015 년

@Kernald 사용 사례에 따라 다릅니다. 개인적으로 Sudhasri가 한 방식이 훨씬 더 깨끗하다고 ​​생각합니다. 특히 "여기에 항목이 없습니다. 쇼핑하러 가세요!"와 같은 선물이없는 경우 다른보기를 표시하려는 경우 특히 그렇습니다. 나 물건 같은 것을
AgentKnopf

@Zainodis 당신이 말했듯이, 그것은 다른 견해입니다. 그건 하지 recyclerview에서 항목을 표시하는 것입니다 어댑터의 Responsibility는, 아무것도. 기술적으로 말하면 두 솔루션 모두 작동하며 거의 동일하다는 데 동의합니다. 그러나 어댑터의 항목은 이와 같은보기를 표시하도록 만들어 지지 않았습니다 .
Marc Plano-Lesay 2015-08-07

10

나는 단순히 다음과 같은 간단한 해결책을 선호합니다.

RecyclerView를 FrameLayout 또는 RelativeLayout 안에 TextView 또는 기타 뷰와 함께 표시하고 기본적으로 가시성이 GONE 인 빈 데이터 메시지를 표시 한 다음 어댑터 클래스에서 논리를 적용합니다.

여기에 데이터가없는 메시지가있는 TextView가 하나 있습니다.

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

3

시도해보십시오 RVEmptyObserver:

를 기본 빈 레이아웃으로 AdapterDataObserver간단히 설정할 수 있는의 구현입니다 . 이렇게하면 사용자 지정을 사용하고 삶을 더 힘들게 만드는 대신 기존 코드와 함께 쉽게 사용할 수 있습니다.ViewRecylerViewRecyclerView


사용 예 :

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

2

https://gist.github.com/adelnizamutdinov/31c8f054d1af4588dc5c 기반 내 버전

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
다시 구현하는 setVisibility것도 좋은 생각 입니다.
Marc Plano-Lesay 2015 년

2

Recycler.Adapter에서이 기능을 구현하고 싶습니다.

재정의 된 getItemCount 메서드에서 빈 확인 코드를 삽입합니다.

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

3
어댑터의 책임이 아닙니다. 어댑터는 항목이없는 것이 아니라 항목을 제시하기 위해 여기에 있습니다.
마크 플라 노 - Lesay

@Kernald 우리의 코드와 우리의 방식, 우리가 그것을 사용자 정의하고 사용하는 방법.
Lalit Poptani 2016

@LalitPoptani 확실합니다. 그러나 그것은 사람들이 대답을 찾고있는 Q & A 웹 사이트이며, 대부분의 경우 "복사 바로 가기가 무엇일까요?"이상을 생각하지 않고 있습니다. (당신은 또한 "권리"솔루션을 가지고 또한 경우) 솔루션이 의미 론적으로 잘못된 것을 나타내는 것은 ... 정말 쓸모없는
마크 플라 노 - Lesay

@Kernald 잘 나는이 솔루션이 가장 간단하고 좋은 솔루션이라고 생각합니다. 왜냐하면 어댑터가 알림을받을 때마다 이것이 호출되고 데이터의 크기를 확인하는 데 사용될 수 있기 때문입니다!
Lalit Poptani

1
@ MarcPlano-Lesay가 정확합니다. 이 답변은 항목이 채워지면 빈 뷰가 보이지 않아야하는 경우를 처리하지 않기 때문에 불완전합니다. 해당 부분을 구현 한 후에는 어댑터가 항목 수를 쿼리 할 때마다 setVisibility()호출 되기 때문에이 솔루션은 비효율적 입니다. 물론 보상을 위해 몇 가지 플래그를 추가 할 수는 있지만 그 때가 더 복잡해집니다.
razzledazzle

2

로드 상태, 오류 상태와 같은 더 많은 상태를 지원 하려면 https://github.com/rockerhieu/rv-adapter-states 를 확인할 수 있습니다 . 그렇지 않으면 빈 뷰를 지원하는 RecyclerViewAdapterWrapper것은 ( https://github.com/rockerhieu/rv-adapter ) 에서 쉽게 구현할 수 있습니다 . 이 접근 방식의 주요 장점은 기존 어댑터의 논리를 변경하지 않고도 빈보기를 쉽게 지원할 수 있다는 것입니다.

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

용법:

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

유사한 솔루션의 기초로 귀하의 코드를 사용했습니다. 감사!
Albert Vila Calvo 2015 년

2

이 문제를 해결했습니다.
layout_recyclerview_with_emptytext.xml 파일을 만들었습니다.
EmptyViewRecyclerView.java 생성
---------

EmptyViewRecyclerView emptyRecyclerView = (EmptyViewRecyclerView) findViewById (R.id.emptyRecyclerViewLayout);
emptyRecyclerView.addAdapter (mPrayerCollectionRecyclerViewAdapter, "선택된 카테고리에 대한기도가 없습니다.");

layout_recyclerview_with_emptytext.xml 파일

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

이와 같은 것이 도움이 될 수 있습니다


2
이것은 불완전합니다. 가 보일 RecyclerViewemptyView(그리고 그 반대) 를 숨겨야 할 것입니다 . 또한 호출해야합니다 checkIfEmpty()onItemRangeInserted()onItemRangeRemoved(). : 아, 그리고 당신은 당신의 소스 인용 한 수 gist.github.com/adelnizamutdinov/31c8f054d1af4588dc5c
마크 플라 노 - Lesay


1

RecyclerView비어있을 때 텍스트를 칠할 수 있습니다 . 다음 사용자 정의 서브 클래스 지원 empty, failed, loading, 및 offline모드. 성공적인 컴파일 recyclerView_stateText을 위해 리소스 에 색상을 추가 하십시오.

/**
 * {@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

내 관점에서 빈 뷰를 수행하는 가장 쉬운 방법은 배경으로 부풀리고 싶은 레이아웃으로 새로운 빈 RecyclerView를 만드는 것입니다. 그리고이 빈 어댑터는 데이터 세트 크기를 확인할 때 설정됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.