0

Friends , I have a fragment with a search-view and recyclerview in it. I want to implement that search-view on the recyclerview data.I am facing problem when i try to call a method from my adapter class in my fragment it does not allow it and asks me to make the method in adapter class as static which is not fine.Here's the required fragment code -

 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);
    }

I am getting error on this line-

(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);

Here's my MyAdaper declaration and initialization -

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

        recyclerView.setAdapter(MyAdapter);

And here's my adapter class (setCategorynames) method.It is asking me to make this method as static -

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

So i want to know how can i call a method of adapter class in a fragment? My adapter class code-

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();
    }
    }
}
payal_suthar
  • 355
  • 8
  • 31

2 Answers2

0

The one issue i see in your code, that setCategorynames(List<String> category_name) method is not resolved because MyAdapter is not casted to (MyCategoryAdaptercheckbox)

You need to replace

(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);

by this

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

Yuri Popiv
  • 519
  • 4
  • 15
0

Firstly create an interface like that;

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

In your adapter, you should implements this listener as you wish. Basically like that :

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

In your fragment's processQuery function you should invoke this ProcessQueryListener. Such as;

ProcessQueryListener queryListener = (MyCategoryAdaptercheckbox) MyAdapter;

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);
            }
        }

        if (queryListener != null) {
           queryListener.onSuccess(result);
        }
}
yilmazburk
  • 907
  • 9
  • 17