diff options
author | ByteHamster <info@bytehamster.com> | 2019-05-03 11:06:04 +0200 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2019-05-03 11:06:04 +0200 |
commit | 06c15fd9e6d4335583512377f1b8401b9ea3ccf6 (patch) | |
tree | 70b02affac79530ac9eaef083c0afee2da28e3f2 /app/src/main/java/de/danoeh/antennapod/view | |
parent | 7a921e0024f0b82653084d91f853fadfe97f9929 (diff) | |
download | AntennaPod-06c15fd9e6d4335583512377f1b8401b9ea3ccf6.zip |
Simplify empty view handling on recycler views
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/view')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java | 92 | ||||
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/view/SimpleAdapterDataObserver.java | 41 |
2 files changed, 105 insertions, 28 deletions
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(); + } +} |