private void update(ArrayList<Category> newItems) {
    ArrayList<Category> arrayForRemoving = new ArrayList<>();
    for (int i = 0; i < publishItems.size(); i++) {
      Category category = publishItems.get(i);
      if (!newItems.contains(category)) {
        arrayForRemoving.add(category);
      }
    }
    for (Category category : arrayForRemoving) {
      publishItems.remove(category);
    }

    for (Category category : newItems) {
      if (publishItems.indexOf(category) == SortedList.INVALID_POSITION) {
        publishItems.add(category);
      }
    }
    if (publishItems.size() == 0) {
      if (currentFilter.equals(FILTER_ALL)) {
        callback.onEmpty(
            R.string.empty_no_categories_restart_app,
            R.drawable.ic_menu_gallery,
            R.string.button_restart_app,
            null);
      } else {
        callback.onEmpty(
            R.string.empty_no_favorite_categories,
            R.drawable.ic_menu_gallery,
            R.string.button_show_all_categories,
            null);
      }
    }
  }
  public CategoriesAdapter(
      Context context, CategoryFavoriteCallback callback, ArrayList<Category> objects) {
    this.context = context;
    this.callback = callback;
    this.objects = objects;
    publishItems =
        new SortedList<>(
            Category.class,
            new SortedList.Callback<Category>() {
              @Override
              public boolean areContentsTheSame(Category oneItem, Category twoItem) {
                return oneItem.contentEquals(twoItem);
              }

              @Override
              public boolean areItemsTheSame(Category oneItem, Category twoItem) {
                return oneItem.equals(twoItem);
              }

              @Override
              public int compare(Category oneItem, Category twoItem) {
                return oneItem.compareTo(twoItem);
              }

              @Override
              public void onChanged(int position, int count) {
                notifyItemRangeChanged(position, count);
              }

              @Override
              public void onInserted(int position, int count) {
                notifyItemRangeInserted(position, count);
              }

              @Override
              public void onMoved(int fromPosition, int toPosition) {
                notifyItemMoved(fromPosition, toPosition);
              }

              @Override
              public void onRemoved(int position, int count) {
                notifyItemRangeRemoved(position, count);
              }
            });
    for (Category category : objects) {
      publishItems.add(category);
    }
  }
  @Override
  public View onCreateView(
      LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
    final View rootView =
        inflater.inflate(R.layout.fragment_recyclerview_sorted_list, container, false);
    final RecyclerView rcRecyclerView = (RecyclerView) rootView.findViewById(R.id.rvRecyclerView);
    final FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab);

    rcRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    adapter =
        new RecyclerViewSortedListAdapter(
            sortedList,
            new View.OnLongClickListener() {
              @Override
              public boolean onLongClick(View v) {
                final int itemPosition = rcRecyclerView.getChildAdapterPosition(v);
                final String item = sortedList.get(itemPosition);

                View view =
                    LayoutInflater.from(getActivity())
                        .inflate(R.layout.dialog_recycler_view_modify, null, false);

                ListView lvListView = (ListView) view.findViewById(R.id.lvListView);
                lvListView.setAdapter(
                    new ArrayAdapter<String>(
                        getActivity(),
                        android.R.layout.simple_list_item_1,
                        android.R.id.text1,
                        new String[] {
                          "Rename", "Delete",
                        }));
                lvListView.setOnItemClickListener(
                    new AdapterView.OnItemClickListener() {
                      @Override
                      public void onItemClick(
                          AdapterView<?> parent, View view, int position, long id) {
                        if (position == 0) { // rename
                          final View view2 =
                              LayoutInflater.from(getActivity())
                                  .inflate(R.layout.dialog_recycler_view_add, null, false);
                          new AlertDialog.Builder(getActivity())
                              .setTitle("Rename " + item + " to")
                              .setView(view2)
                              .setPositiveButton(
                                  android.R.string.ok,
                                  new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                      EditText etRename =
                                          (EditText) view2.findViewById(R.id.etItem);
                                      sortedList.updateItemAt(
                                          itemPosition, etRename.getText().toString());
                                      dialog.dismiss();
                                    }
                                  })
                              .setNegativeButton(
                                  android.R.string.cancel,
                                  new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                      dialog.dismiss();
                                    }
                                  })
                              .create()
                              .show();
                        } else if (position == 1) { // delete
                          sortedList.removeItemAt(itemPosition);
                        }
                        mDialog.dismiss();
                      }
                    });

                mDialog =
                    new AlertDialog.Builder(getActivity()).setTitle(item).setView(view).create();
                mDialog.show();

                return false;
              }
            });
    sortedList.add("Banana");
    sortedList.add("Apple");
    rcRecyclerView.setAdapter(adapter);

    fab.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            final View view =
                LayoutInflater.from(getActivity())
                    .inflate(R.layout.dialog_recycler_view_add, null, false);
            new AlertDialog.Builder(getActivity())
                .setTitle("Add Item")
                .setView(view)
                .setNegativeButton(
                    android.R.string.cancel,
                    new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                      }
                    })
                .setPositiveButton(
                    android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                        EditText etItem = (EditText) view.findViewById(R.id.etItem);
                        sortedList.add(etItem.getText().toString());
                        dialog.dismiss();
                      }
                    })
                .create()
                .show();
          }
        });

    return rootView;
  }