Вызов метода адаптера во фрагменте - PullRequest
0 голосов
/ 04 апреля 2019

Друзья, у меня есть фрагмент с поиском и повторным просмотром в нем. Я хочу реализовать это представление для поиска в данных повторного просмотра. Я сталкиваюсь с проблемой, когда пытаюсь вызвать метод из моего класса адаптера в моем фрагменте, он не позволяет его и просит сделать метод в классе адаптера статическим, что не хорошо. Вот необходимый фрагмент кода -

 private void processQuery(String query) {
        // in real app you'd have it instantiated just once
        ArrayList<String> result = new ArrayList<>();

        // case insensitive search
        for (String category : category_name) {
            if (category.toLowerCase().contains(query.toLowerCase())) {
                result.add(category);
            }
        }

        (MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);
    }

Я получаю сообщение об ошибке -

(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);

Вот мое объявление и инициализация MyAdaper -

RecyclerView.Adapter MyAdapter;
 MyAdapter = new MyCategoryAdaptercheckbox(getMyCategoryAdapter1, getActivity().getApplicationContext(),category_name);

        recyclerView.setAdapter(MyAdapter);

А вот мой метод класса адаптера (setCategorynames). Он просит меня сделать этот метод статическим -

public  void setCategorynames(List<String> category_name) {
        this.category_name = category_name;
        notifyDataSetChanged();
    }

Итак, я хочу знать, как я могу вызвать метод класса адаптера во фрагменте? Код моего адаптера класса -

public class MyCategoryAdaptercheckbox extends RecyclerView.Adapter<MyCategoryAdaptercheckbox.ViewHolder> {
    List<GetMyCategoryAdapter> getMyCategoryAdapter;
    Context context;
    List<String> category_name;
   GetMyCategoryAdapter getMyCategoryAdapter1;

    public MyCategoryAdaptercheckbox(List<GetMyCategoryAdapter> getMyCategoryAdapter, Context context, List<String> category_name) {
    this.getMyCategoryAdapter = getMyCategoryAdapter;
    this.context = context;
    this.category_name = category_name;
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        if (viewHolder instanceof ViewHolder){
        }
        getMyCategoryAdapter1 =  getMyCategoryAdapter.get(i);
      ((ViewHolder) viewHolder).tv_categorytitle.setText(getMyCategoryAdapter1.getC_name());
        ((ViewHolder) viewHolder).tv_categoryid.setText(getMyCategoryAdapter1.getC_id());
        ((ViewHolder) viewHolder).gt= getMyCategoryAdapter1;
    }

    public void filterList(ArrayList<String> filterdNames) {
        this.category_name = filterdNames;
        notifyDataSetChanged();
    }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Сначала создайте такой интерфейс;

public interface ProcessQueryListener{
     void onSuccess(List<String> result);
}

В вашем адаптере вы должны реализовать этот слушатель по своему усмотрению.В основном так:

public MyCategoryAdaptercheckbox extends RecyclerView.Adapter implements ProcessQueryListener {
    @Override
    public void onSuccess(List<String> result){
         this.setCategorynames(result);
    }
}
.
.

В функции processQuery вашего фрагмента вы должны вызвать этот ProcessQueryListener.Такие как

1008 *
0 голосов
/ 04 апреля 2019

Одна проблема, которую я вижу в вашем коде, это setCategorynames(List<String> category_name) method is not resolved, потому что MyAdapter не приведен к (MyCategoryAdaptercheckbox)

Вам необходимо заменить

(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);

этим

((MyCategoryAdaptercheckbox) MyAdapter).setCategorynames(result);

...