I followed some youtube tutorial about SQLite and RecyclerView (https://www.youtube.com/watch?v=VQKq9RHMS_0&ab_channel=Stevdza-San) I completed all the things and customize it as I need to my app and everything work fine.
Now all I want to do is add Search Button at the top (Action Bar) that i can search items from my RecyclerView.
So i was try to figure out how to implement it, but I struggle with the filter and all those things. Every tutorials that I saw about this work with List (E) while my CustomeAdpter geting ArrayList and I can't undrstand how to make it work with the ArrayList.
So if some one can help me with that and give me some little guidance I will be grateful
EDIT
I added the getFilter() function in my adapter, but when I try to search something nothing happened in RecyclerView.
I am adding my code: MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    activity = MainActivity.this;
    noClubsImage = findViewById(R.id.noClubsImage);
    noClubsText = findViewById(R.id.noClubsText);
    recyclerView = findViewById(R.id.recyclerView);
    add_button = findViewById(R.id.add_button);
    add_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, AddActivity.class);
            activity.startActivityForResult(intent,1);
        }
    });
    myDB = new MyDatabaseHelper(MainActivity.this);
    club_id = new ArrayList<>();
    club_name = new ArrayList<>();
    join_date = new ArrayList<>();
    expire_date = new ArrayList<>();
    storeDataInArrays();
    customAdapter = new CustomAdapter(MainActivity.this, this, club_id, club_name, join_date, expire_date);
    recyclerView.setAdapter(customAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
}
. . . EDIT***
    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    MenuItem item = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) item.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            customAdapter.getFilter().filter(query);
            return false;
        }
        @Override
        public boolean onQueryTextChange(String newText) {
            customAdapter.getFilter().filter(newText);
            return true;
        }
    });
    return super.onCreateOptionsMenu(menu);
}
}
And this is my Adapter:
I added Try & catch function in onBindViewHolder becuase it's crash if not and get this error: "java.lang.IndexOutOfBoundsException: Index: 1, Size: 1" After adding it, I can search but something very weird, upload some pictures: When I start the app Start searching "Yasha" -> it change the two rows
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> implements Filterable{
private Context context;
private Activity activity;
private ArrayList club_id, club_name, join_date,expire_date,list,originalList;
int position;
Animation translate_anim;
CustomAdapter(Activity activity, Context context, ArrayList club_id, ArrayList club_name, ArrayList join_date, ArrayList expire_date){
    this.activity = activity;
    this.context = context;
    this.club_id = club_id;
    this.club_name = club_name;
    this.join_date = join_date;
    this.expire_date = expire_date;
    this.list = club_name;
    this.originalList = club_name;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.my_row,parent,false);
    return new MyViewHolder(view);
}
public Filter getFilter(){
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            ArrayList filteredResults = null;
            if (constraint.length() == 0) {
                filteredResults = club_name;
            } else {
                filteredResults = getFilteredResults(constraint.toString().toLowerCase());
            }
            FilterResults results = new FilterResults();
            results.values = filteredResults;
            Log.d("Test",filteredResults.toString());
            return results;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            club_name = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }
    };
}
protected ArrayList getFilteredResults(String constraint) {
    ArrayList results = new ArrayList<>();
    for (Object item : originalList) {
        if (item.toString().toLowerCase().contains(constraint)) {
            results.add(item.toString());
        }
    }
    //Log.d("Test",results.toString());
    return results;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
    try{
        this.position = position;
        holder.club_name_txt.setText(String.valueOf(club_name.get(position)));
        holder.join_txt.setText(String.valueOf(join_date.get(position)));
        holder.expire_txt.setText(String.valueOf(expire_date.get(position)));
        holder.mainLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context,UpdateActivity.class);
                intent.putExtra("club_id",String.valueOf(club_id.get(position)));
                intent.putExtra("club_name",String.valueOf(club_name.get(position)));
                intent.putExtra("join_date",String.valueOf(join_date.get(position)));
                intent.putExtra("expire_date",String.valueOf(expire_date.get(position)));
                activity.startActivityForResult(intent,1);
            }
        });
    }catch(Exception ex) {
        Log.e("TAG", "EXCEPTION CAUGHT WHILE EXECUTING DATABASE TRANSACTION");
        ex.printStackTrace();
    }
}
@Override
public int getItemCount() {
    return club_id.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
    LinearLayout mainLayout;
    TextView club_id_txt, club_name_txt, join_txt,expire_txt;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        club_name_txt = itemView.findViewById(R.id.club_name_txt);
        join_txt = itemView.findViewById(R.id.jDate_txt);
        expire_txt = itemView.findViewById(R.id.eDate_txt);
        mainLayout = itemView.findViewById(R.id.mainLayout);
        translate_anim = AnimationUtils.loadAnimation(context, R.anim.translate_anim);
        mainLayout.setAnimation(translate_anim);
    }
 }}
 
     
    