0

This is my fragment which is like MainActivity :

   public class cgpa_frag extends Fragment {

    RecyclerView recyclerview;
    adapter_cgpa ac;

    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);
        cgpaArrayList = new ArrayList<>();
        ac = new adapter_cgpa(cgpaArrayList);
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
        recyclerview.setAdapter(ac);


        Fetchdata2();
        return view;
    }

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

        Cursor cursor = db.fetch_data2();

        if (cursor != null) {

            // cursor.moveToFirst();
            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) {
        super.onCreateOptionsMenu(menu, inflater);

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

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        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;

            }
        });
    }
}

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

    private Filter exampleFilter = new Filter() {

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

            if(constraint==null || constraint.length()==0){
                filteredList.addAll(cgpaArrayListcopy);
            }
            else {
                String filterPattern = constraint.toString().toLowerCase().trim();
                for( POJO item : cgpaArrayListcopy){
                    if (item.getCname().toLowerCase().contains(filterPattern)){
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results=new FilterResults();
            results.values=filteredList;
            return results;
        }

        @Override
        protected 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=(TextView)itemView.findViewById(R.id.name);
            no_of_sems=(TextView)itemView.findViewById(R.id.no_of_sem);
            cgpa=(TextView)itemView.findViewById(R.id.textView49);
            percentage=(TextView)itemView.findViewById(R.id.textView55);
            schemec=(TextView)itemView.findViewById(R.id.scheme2);
            btndelete2=(ImageButton)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);
        }
    }
}

This is search_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/action_search"
        android:icon="@drawable/ic_search"
        android:title="Search by name..."
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.widget.SearchView" />

</menu>

I am always getting only the first data as output irrespective of any data I am searching for.

This is my recycler view:

enter image description here

And this is what I am getting after search:

enter image description here

Can someone tell me where am I going wrong?

I have referred this video: https://codinginflow.com/tutorials/android/searchview-recyclerview

  • refer https://stackoverflow.com/questions/40754174/android-implementing-search-filter-to-a-recyclerview – sasikumar Mar 18 '20 at 07:48
  • Do you want to use a searchview? – MMG Mar 18 '20 at 07:49
  • @MohammadMoeinGolchin Yes –  Mar 18 '20 at 08:00
  • See the page I linked to – MMG Mar 18 '20 at 08:06
  • Why did you define 'result' as 'FilterResults'? Define it as Arraylist and add 'filteredList.items' to it. I think you should replace 'result' with 'filteredList.items'. – MMG Mar 23 '20 at 10:46
  • Can you please make changes to my existing code and show me how to do it exactly ? I will verify your answer after that if it works. –  Mar 23 '20 at 11:15
  • cgpaArrayList.addAll(filteredList) – MMG Mar 23 '20 at 12:01
  • If you want to answer me, you should put my name in @ – MMG Mar 23 '20 at 12:02
  • @MohammadMoeinGolchin It cannot resolve the symbol name filteredList there. –  Mar 23 '20 at 12:06
  • I think your filteredList is what you want. You should give it to your output adapter. Give items of your filteredList to cpgaArraylist. – MMG Mar 23 '20 at 12:14
  • Please tell me your problem solved or not? – MMG Mar 24 '20 at 04:02
  • @MohammadMoeinGolchin We are assigning filteredList only to results.values. And no, it is still not solved. –  Mar 24 '20 at 06:30
  • May you give us your full code? Is there in github? Can you email it? – MMG Mar 25 '20 at 09:25
  • I dont see you calling publishResults anywhere. is this correct? have you done it somewhere else?shouldnt you be calling that after you feed chars into the filter i onQueryTextChange – quealegriamasalegre Mar 26 '20 at 18:48
  • @MohammadMoeinGolchin I am sorry, I cannot provide you the full code. –  Mar 27 '20 at 07:11
  • @quealegriamasalegre I think that we can't call adapter method in activity. –  Mar 27 '20 at 11:56
  • @Sanidhya I mean normally you can, but you are right, i faild to notice those methods were just being overriden, they are actually called by the filter method you are already using in onQueryTextChange. i have watched your video but i cant find whats wrong – quealegriamasalegre Mar 27 '20 at 17:35
  • frankly I cant figure out the issue so far, my best advice would be to throw some logs in there. log the text being passes for search into the filter and also the text contained in the name variable. check the size on the object returned by the filter and so on. it might be just some small mistake in the variables you are using or an issue with dependencies, who knows. – quealegriamasalegre Mar 27 '20 at 17:46

4 Answers4

0

Just add SearchView before RecyclerView, and configurate it

0

See this page, I think it is what you want: https://demonuts.com/kotlin-recyclerview-searchview/

It has searchview used in recyclerview.

MMG
  • 2,962
  • 5
  • 8
  • 35
  • It is in Kotlin. I am using java. –  Mar 18 '20 at 12:50
  • You can convert it, or see here, https://codinginflow.com/tutorials/android/searchview-recyclerview @Sanidhya Setu – MMG Mar 18 '20 at 13:04
  • But because I am doing it in a fragment and not activity, it is not working for me. –  Mar 22 '20 at 09:37
  • It is different but main idea that you should use is the same.@Sanidhya Setu – MMG Mar 22 '20 at 09:55
  • please see my edited question and if can help me with it. –  Mar 23 '20 at 04:50
  • See this question please: https://stackoverflow.com/questions/59628149/how-to-have-searched-characters-colored-when-we-use-searchview-in-recyclerview @Sanidhya Setu – MMG Mar 23 '20 at 09:56
  • I had the same problem, in this question and answer that I had posted I could filter searched characters in one recyclerview and make them colored. Of course it is in Kotlin. It may help you.@Sanidhya Setu – MMG Mar 23 '20 at 09:58
0
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;

import java.util.ArrayList;
import java.util.List;

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
            protected 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);
        }
    }
}
jaffar
  • 639
  • 8
  • 21
0

this is not a propper answer but maybe it helps. its a longshot but I thing the issue might be in some weird code constelation you have in your fragment class mainly the way you implemented fetchdata2.

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);
    cgpaArrayList = new ArrayList<>();
    //put this method here
    Fetchdata2();
    ac = new adapter_cgpa(cgpaArrayList);
    recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
    recyclerview.setAdapter(ac);



    return view;
}

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

    Cursor cursor = db.fetch_data2();

    if (cursor != null) {

        // cursor.moveToFirst();
        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);
        }

    }

}

I just notices you were setting the adapter a bunch of times inside the cursor and now its only being set once. I am still not sure this will solve your problem but give it a try.

Now fetchdata2 is only populating cgpaArraylist and the adapter is created in a different step after this method is excecuted

quealegriamasalegre
  • 1,385
  • 5
  • 18
  • happy to have helped ;). sometimes the issue is exactly where you are not looking haha – quealegriamasalegre Mar 28 '20 at 03:59
  • Can you help me out with one more question? –  Mar 28 '20 at 07:07
  • How can I highlight the filtered text in the recyclerview while searching in this code? –  Mar 28 '20 at 07:24
  • quite frankly I have never done this before although it seems useful. here is a similar question that seems to have a well accepted answer apparently you need to use spannable https://stackoverflow.com/questions/40256605/how-to-highlight-filtered-text-in-recyclerview-when-using-searchview-widget/50760200 – quealegriamasalegre Mar 28 '20 at 07:33
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/210485/discussion-between-sanidhya-setu-and-quealegriamasalegre). –  Mar 28 '20 at 09:49