From 06c15fd9e6d4335583512377f1b8401b9ea3ccf6 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 3 May 2019 11:06:04 +0200 Subject: Simplify empty view handling on recycler views --- .../danoeh/antennapod/view/EmptyViewHandler.java | 92 +++++++++++++++------- .../antennapod/view/SimpleAdapterDataObserver.java | 41 ++++++++++ 2 files changed, 105 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/de/danoeh/antennapod/view/SimpleAdapterDataObserver.java (limited to 'app/src/main/java/de/danoeh/antennapod/view') diff --git a/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java b/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java index e3fd63235..42c11bc8e 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java @@ -1,59 +1,95 @@ package de.danoeh.antennapod.view; -import android.app.Activity; import android.content.Context; +import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; +import android.widget.RelativeLayout; import android.widget.TextView; import de.danoeh.antennapod.R; -public class EmptyViewHandler extends View { - private Activity activity; - private int title; - private int message; +public class EmptyViewHandler { + private boolean layoutAdded = false; + private RecyclerView recyclerView; + private RecyclerView.Adapter adapter; - public EmptyViewHandler(Context context) { - super(context); - this.setActivity((Activity) context); - } + private final View emptyView; + private final TextView tvTitle; + private final TextView tvMessage; - public int getTitle() { - return title; + public EmptyViewHandler(Context context) { + emptyView = View.inflate(context, R.layout.empty_view_layout, null); + tvTitle = emptyView.findViewById(R.id.emptyViewTitle); + tvMessage = emptyView.findViewById(R.id.emptyViewMessage); } public void setTitle(int title) { - this.title = title; - } - - public int getMessage() { - return message; + tvTitle.setText(title); } public void setMessage(int message) { - this.message = message; + tvMessage.setText(message); } - public void attachToListView(ListView listView){ + public void hide() { + emptyView.setVisibility(View.GONE); + } - View emptyView = getActivity().getLayoutInflater().inflate(R.layout.empty_view_layout, null); + public void attachToListView(ListView listView) { + if (layoutAdded) { + throw new IllegalStateException("Can not attach to ListView multiple times"); + } + layoutAdded = true; ((ViewGroup) listView.getParent()).addView(emptyView); listView.setEmptyView(emptyView); + } - TextView tvTitle = (TextView) emptyView.findViewById(R.id.emptyViewTitle); - tvTitle.setText(title); - - TextView tvMessage = (TextView) emptyView.findViewById(R.id.emptyViewMessage); - tvMessage.setText(message); + public void attachToRecyclerView(RecyclerView recyclerView) { + if (layoutAdded) { + throw new IllegalStateException("Can not attach to ListView multiple times"); + } + layoutAdded = true; + this.recyclerView = recyclerView; + ViewGroup parent = ((ViewGroup) recyclerView.getParent()); + parent.addView(emptyView); + updateAdapter(recyclerView.getAdapter()); + if (parent instanceof RelativeLayout) { + RelativeLayout.LayoutParams layoutParams = + (RelativeLayout.LayoutParams)emptyView.getLayoutParams(); + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); + emptyView.setLayoutParams(layoutParams); + } } - public Activity getActivity() { - return activity; + public void updateAdapter(RecyclerView.Adapter adapter) { + if (this.adapter != null) { + this.adapter.unregisterAdapterDataObserver(adapterObserver); + } + this.adapter = adapter; + if (adapter != null) { + adapter.registerAdapterDataObserver(adapterObserver); + } + updateVisibility(); } - public void setActivity(Activity activity) { - this.activity = activity; + private final SimpleAdapterDataObserver adapterObserver = new SimpleAdapterDataObserver() { + @Override + public void anythingChanged() { + updateVisibility(); + } + }; + + private void updateVisibility() { + boolean empty; + if (adapter == null) { + empty = true; + } else { + empty = adapter.getItemCount() == 0; + } + recyclerView.setVisibility(empty ? View.GONE : View.VISIBLE); + emptyView.setVisibility(empty ? View.VISIBLE : View.GONE); } } diff --git a/app/src/main/java/de/danoeh/antennapod/view/SimpleAdapterDataObserver.java b/app/src/main/java/de/danoeh/antennapod/view/SimpleAdapterDataObserver.java new file mode 100644 index 000000000..45c3a35bd --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/view/SimpleAdapterDataObserver.java @@ -0,0 +1,41 @@ +package de.danoeh.antennapod.view; + +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; + +/** + * AdapterDataObserver that relays all events to the method anythingChanged(). + */ +public abstract class SimpleAdapterDataObserver extends RecyclerView.AdapterDataObserver { + public abstract void anythingChanged(); + + @Override + public void onChanged() { + anythingChanged(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount) { + anythingChanged(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) { + anythingChanged(); + } + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + anythingChanged(); + } + + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { + anythingChanged(); + } + + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + anythingChanged(); + } +} -- cgit v1.2.3