0

This is my fragment where I have my recyclerview along with a search view:

public class cgpa_frag extends Fragment {

    RecyclerView recyclerview;
    adapter_cgpa ac;
    TextView tv_noContent2;

    ArrayList<POJO> cgpaArrayList = new ArrayList<>();

    public cgpa_frag() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        setHasOptionsMenu(true);

        View view = inflater.inflate(R.layout.fragment_cgpa_frag, container, false);
        recyclerview = (RecyclerView) view.findViewById(R.id.rc2);
        tv_noContent2 = (TextView)view.findViewById(R.id.tv_noContent2);
        cgpaArrayList = new ArrayList<>();
        Fetchdata2();
        ac = new adapter_cgpa(cgpaArrayList);
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
        if(cgpaArrayList.isEmpty()){
            recyclerview.setVisibility(View.GONE);
            tv_noContent2.setVisibility(View.VISIBLE);
            tv_noContent2.setText("Look's like you have not saved any CGPA calculation.");

        }else{
            tv_noContent2.setVisibility(View.GONE);
            recyclerview.setVisibility(View.VISIBLE);
            recyclerview.setAdapter(ac);
        }

        return view;
    }

    private void Fetchdata2() {
        dbmanager db = new dbmanager(getContext());

        Cursor cursor = db.fetch_data2();

        if (cursor != null) {

            while (cursor.moveToNext()) {

                POJO pj = new POJO();
                pj.setCname(cursor.getString(0));
                pj.setNo_of_sems(cursor.getString(1));
                pj.setCgpa(cursor.getString(2));
                pj.setPercentage(cursor.getString(3));
                pj.setSchemec(cursor.getString(4));
                cgpaArrayList.add(pj);
            }
            // ac = new adapter_cgpa(cgpaArrayList);
        }
    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {

        inflater.inflate(R.menu.search_menu, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.onActionViewExpanded();
        searchView.setIconifiedByDefault(false);
        searchView.setQueryHint("Search by name ... ");

        if(!searchView.isFocused()) {
            searchView.clearFocus();
        }

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                ac.getFilter().filter(newText);
                return false;
            }
        });
    }
}

And this is my adapter class:

public class adapter_cgpa extends RecyclerView.Adapter<adapter_cgpa.Viewholder> implements Filterable  {

    ArrayList<POJO> cgpaArrayList;
    ArrayList<POJO> cgpaArrayListcopy;


    public adapter_cgpa(ArrayList<POJO> cgpaArrayList) {
        this.cgpaArrayList = cgpaArrayList;
        cgpaArrayListcopy = new ArrayList<>(cgpaArrayList);
    }

    @NonNull
    @Override
    public adapter_cgpa.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View listitem = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_cgpa, parent, false);
        return new Viewholder(listitem);
    }

    @Override
    public void onBindViewHolder(@NonNull adapter_cgpa.Viewholder holder, int position) {
        POJO cgpa = cgpaArrayList.get(position);
        holder.cname.setText(cgpa.getCname());
        holder.no_of_sems.setText(cgpa.getNo_of_sems());
        holder.cgpa.setText(cgpa.getCgpa());
        holder.percentage.setText(cgpa.getPercentage());
        holder.schemec.setText(cgpa.getSchemec());

    }

    @Override
    public int getItemCount() {
        return cgpaArrayList.size();
    }


    @Override
    public Filter getFilter() {
      return new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                List<POJO> filteredList = new ArrayList<>();


                if (TextUtils.isEmpty(constraint)) {
                    filteredList.addAll(cgpaArrayListcopy);
                } else {
                    String filterPattern = constraint.toString().toLowerCase().trim();
                    for (POJO item : cgpaArrayListcopy) {
                        if (item.getCname().toLowerCase().contains(filterPattern)) {
                            filteredList.add(item);
                        }else{
                            filteredList.remove(item);
                        }
                    }
                }

                FilterResults results = new FilterResults();
                results.values = filteredList;
                return results;
            }

            @Override
            public void publishResults(CharSequence constraint, FilterResults results) {

                cgpaArrayList.clear();
                    cgpaArrayList.addAll((List) results.values);
                    notifyDataSetChanged();
            }

        };

    }

    public class Viewholder extends RecyclerView.ViewHolder {
        TextView cname, no_of_sems, cgpa, percentage, schemec;
        ImageButton btndelete2;

        public Viewholder(@NonNull View itemView) {
            super(itemView);
            cname = itemView.findViewById(R.id.name);
            no_of_sems = itemView.findViewById(R.id.no_of_sem);
            cgpa = itemView.findViewById(R.id.textView49);
            percentage = itemView.findViewById(R.id.textView55);
            schemec = itemView.findViewById(R.id.scheme2);
            btndelete2 = itemView.findViewById(R.id.btndelete2);

            btndelete2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());
                    alert.setMessage("Are you sure you want to delete this?");

                    alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    });
                    alert.setPositiveButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    });
                    final AlertDialog dialogs = alert.create();
                    dialogs.show();
                    dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            delete(getAdapterPosition());
                            dialogs.dismiss();

                        }
                    });
                    dialogs.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            dialogs.dismiss();
                        }
                    });
                }
            });

        }


        private void delete(int adapterPosition) {

            cgpaArrayList.remove(adapterPosition);
            notifyDataSetChanged();
            final String snc = cname.getText().toString();
            final String semrc = no_of_sems.getText().toString();
            final String schc = schemec.getText().toString();

            dbmanager db = new dbmanager(itemView.getContext());
            db.delete2(snc, semrc, schc);
        }
    }
}

What I want is that when the search has no results, the user should be displayed "there is no result matching your search". How can I edit my code for that? Any help would be acknowledged and appreciated. Thanks in advance.

Sneha
  • 94
  • 10
  • just going to give you the basic idea, since you are using the filterable interface, while you are publishing results, just check the size of results array and based on that sends the callback to your fragment which can switch your view. – Gautam May 03 '20 at 16:51
  • Can you please be a little more detailed? @Gautam – Sneha May 03 '20 at 16:57
  • in public void publishResults() method check the size of results and based on that change the view – Gautam May 03 '20 at 17:09
  • @Gautam I am sorry, I don't know how to do that. Like, I can check the size, but then what next? – Sneha May 03 '20 at 17:25
  • so basically create an interface and let your fragment implement it and pass the listener to the adapter. So when size is 0 just invoke the listener so you get a callback in fragment and set the visibility of your tv_noContent2 textview – Gautam May 03 '20 at 17:37

1 Answers1

2

Try change:

ac.getFilter().filter(newText);

to

ac.getFilter().filter(newText, new Filter.FilterListener() {
        @Override
        public void onFilterComplete(int i) {
            if(i == 0){
                recyclerview.setVisibility(View.GONE);
                tv_noContent2.setVisibility(View.VISIBLE);
                tv_noContent2.setText("Look's like you have not saved any CGPA calculation.");
            }else{
                tv_noContent2.setVisibility(View.GONE);
                recyclerview.setVisibility(View.VISIBLE);
            }
        }
});

Hope that helps!

i_A_mok
  • 2,744
  • 2
  • 11
  • 15
  • Thank you so much ! – Sneha May 04 '20 at 06:41
  • Can you please have a look at this as well? https://stackoverflow.com/questions/61563274/highlight-filtered-text-in-recyclerview?noredirect=1#comment108902654_61563274 – Sneha May 04 '20 at 06:42