EmptyRecyclerView.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Nextcloud - Android Client
  3. *
  4. * SPDX-FileCopyrightText: 2018 Tobias Kaminsky <tobias@kaminsky.me>
  5. * SPDX-FileCopyrightText: 2018 Nextcloud GmbH
  6. * SPDX-License-Identifier: AGPL-3.0-or-later
  7. */
  8. package com.owncloud.android.ui;
  9. import android.content.Context;
  10. import android.util.AttributeSet;
  11. import android.view.View;
  12. import androidx.annotation.Nullable;
  13. import androidx.recyclerview.widget.RecyclerView;
  14. /**
  15. * Extends RecyclerView to show a custom view if no data is available Inspired by http://alexzh.com/tutorials/how-to-setemptyview-to-recyclerview
  16. */
  17. public class EmptyRecyclerView extends RecyclerView {
  18. private View mEmptyView;
  19. private boolean hasFooter = false;
  20. public EmptyRecyclerView(Context context) {
  21. super(context);
  22. }
  23. public EmptyRecyclerView(Context context, @Nullable AttributeSet attrs) {
  24. super(context, attrs);
  25. }
  26. public EmptyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
  27. super(context, attrs, defStyle);
  28. }
  29. @Override
  30. public void setAdapter(Adapter adapter) {
  31. Adapter oldAdapter = getAdapter();
  32. super.setAdapter(adapter);
  33. if (oldAdapter != null) {
  34. oldAdapter.unregisterAdapterDataObserver(observer);
  35. }
  36. if (adapter != null) {
  37. adapter.registerAdapterDataObserver(observer);
  38. }
  39. }
  40. public void setEmptyView(View view) {
  41. this.mEmptyView = view;
  42. initEmptyView();
  43. }
  44. private void initEmptyView() {
  45. if (mEmptyView != null) {
  46. int emptyCount = hasFooter ? 1 : 0;
  47. boolean empty = getAdapter() == null || getAdapter().getItemCount() == emptyCount;
  48. mEmptyView.setVisibility(empty ? VISIBLE : GONE);
  49. mEmptyView.setFocusable(false);
  50. this.setVisibility(empty ? GONE : VISIBLE);
  51. }
  52. }
  53. private final AdapterDataObserver observer = new AdapterDataObserver() {
  54. @Override
  55. public void onChanged() {
  56. super.onChanged();
  57. initEmptyView();
  58. }
  59. @Override
  60. public void onItemRangeChanged(int positionStart, int itemCount) {
  61. super.onItemRangeChanged(positionStart, itemCount);
  62. initEmptyView();
  63. }
  64. @Override
  65. public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) {
  66. super.onItemRangeChanged(positionStart, itemCount, payload);
  67. initEmptyView();
  68. }
  69. @Override
  70. public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
  71. super.onItemRangeMoved(fromPosition, toPosition, itemCount);
  72. initEmptyView();
  73. }
  74. @Override
  75. public void onItemRangeInserted(int positionStart, int itemCount) {
  76. super.onItemRangeInserted(positionStart, itemCount);
  77. initEmptyView();
  78. }
  79. @Override
  80. public void onItemRangeRemoved(int positionStart, int itemCount) {
  81. super.onItemRangeRemoved(positionStart, itemCount);
  82. initEmptyView();
  83. }
  84. };
  85. public void setHasFooter(boolean bool) {
  86. hasFooter = bool;
  87. }
  88. }