Вызов метода из одного RecyclerView.Adapter в другом RecyclerView.Adapter

244
25 октября 2017, 03:24

У меня есть два RecyclerView. В первом (CategoriesRV) отображаются категории, а в другом (ElementsRV) элементы этих категорий. При добавлении элементов в ElementsRV сразу задаются категории из CategoriesRV.

Допустим, в CategoriesRV добавлено 3 категории, а в ElementsRV десяток элементов, каждый из которых привязан к той или иной категории. В CategoriesRV реализовано удаление категорий. Я удаляю одну из них, но в ElementsRV продолжает отображаться эта удалённая категория. В момент удаления из CategoriesRV необходимо "дёргать" метод из ElementsRV для очистки упоминаний об удалённой категории.

Пока додумался только до такой реализации:

Метод из адаптера CategoriesRV

private void deleteCategory() {
            CategoryModel currentCategory = categoryModels.get(getAdapterPosition());
            SharedPreferences spCategories = context.getSharedPreferences("spCategories",
                    Context.MODE_PRIVATE);
            spCategories.edit().remove(currentCategory.getCategoryId()).apply();
            categoryModels.remove(currentCategory);
            Toast.makeText(context, R.string.preset_deleted,
                    Toast.LENGTH_LONG).show();
            notifyDataSetChanged();
            ElementsRV.deleteItem(context);
        }

ElementsRV.deleteItem(context) - метод из адаптера ElementsRV:

public static void deleteItem(Context context){
        SharedPreferences sp = context.getSharedPreferences("spCategories", Context.MODE_PRIVATE);
        for (int i = 0; i < recipesModelList.size(); i++){
            if (!sp.contains(recipesModelList.get(i).getCategoryName())){
                recipesModelList.get(i).setCategoryName("");
                recipesModelList.get(i).setCategoryBtnColor(0);
                recipesModelList.get(i).setCategoryTextColor(0);
                notifyItemChanged(i); // Non-static method 'notifyItemChanged(int)' cannot be referenced from a static context
            }
        }
    }

Проблема в том, что notifyItemChanged() не может вызываться из статичного метода. Как быть в этой ситуации?

UPD: Проблема с доступом решена. Теперь появился другой вопрос. Во вьюшке элемента из ElementsRV есть пометка о привязанной категории. Методы, написанные ниже, её убирают только из файла SharedPrefences, а на самой вьюхе после удаления остаётся. Пропадает только при повтороном входе в это активити. Пробовал и notifyDataSetChanged(), и notifyItemChanged().

CategoriesRV

private void deleteCategory() {
            CategoryModel currentCategory = categoryModels.get(getAdapterPosition());
            SharedPreferences spCategories = context.getSharedPreferences("spCategories",
                    Context.MODE_PRIVATE);
            spCategories.edit().remove(currentCategory.getCategoryId()).apply();
            categoryModels.remove(currentCategory);
            Toast.makeText(context, R.string.preset_deleted,
                    Toast.LENGTH_LONG).show();
            notifyDataSetChanged();
            ElementsRV erv = new ElementsRV ();
            erv.deleteItem(context, currentCategory.getCategoryName(), recipesAdapter);
    }

ElementsRV

public  void deleteItem(Context context, String categoryName, ElementsRV erv){
        SharedPreferences.Editor spRecipes;
        for (int i = 0; i < recipesModelList.size(); i++){
            if (recipesModelList.get(i).getCategoryName().equals(categoryName)){
                spRecipes = context.getSharedPreferences(recipesModelList.get
                        (i).getName(), Context.MODE_PRIVATE).edit();
                spRecipes.putString("categoryName", "");
                spRecipes.putInt("categoryBtnColor", 0);
                spRecipes.putInt("categoryTextColor", 0);
                spRecipes.apply();
                recipesModelList.get(i).setCategoryName("");
                recipesModelList.get(i).setCategoryBtnColor(0);
                recipesModelList.get(i).setCategoryTextColor(0);
            }
        }
        erv.notifyDataSetChanged();
    }

Скрин:

Answer 1

метод static принадлежит классу, он не понимает, у какого объекта надо вызвать notifyItemChanged поэтому нужно либо передать ссылку на объект класса ElementsRV:

ElementsRV.deleteItem(context, elementsRV);

elementsRV это экземпляр класса ElementsRV

public static void deleteItem(Context context, ElementsRV erv){
        SharedPreferences sp = context.getSharedPreferences("spCategories", Context.MODE_PRIVATE);
        for (int i = 0; i < recipesModelList.size(); i++){
            if (!sp.contains(recipesModelList.get(i).getCategoryName())){
                recipesModelList.get(i).setCategoryName("");
                recipesModelList.get(i).setCategoryBtnColor(0);
                recipesModelList.get(i).setCategoryTextColor(0);
                erv.notifyItemChanged(i); // Non-static method 'notifyItemChanged(int)' cannot be referenced from a static context
            }
        }
    }

Либо всё-таки сделать deleteItem не статическим и тогда всё будет работать правильно

elementsRV.deleteItem(context);
READ ALSO
Как распарсить json файл в android?

Как распарсить json файл в android?

Пример кода из файла(сначала идет описание города, потом идет описание станций в этом городе):

280
Сортировка методом пузырька

Сортировка методом пузырька

Нужно создать сортировку массива методом пузырька, когда пузырек "тонет" (с конца массива до начала, НЕ сортировка по убыванию) В чем проблема?...

213
Модификация Jira с помощью api/rest api

Модификация Jira с помощью api/rest api

ЗдравствуйтеНужно поизучать Jira и возможности работы с ней из вне

207
Вопрос по C# OpenQA.Selenium

Вопрос по C# OpenQA.Selenium

Как собрать все значение data-url="/af54359643" используя OpenQASelenium ? Пытаюсь разобраться в документации, там есть метод FindElements, но судя по всему, он значения...

340