Why is the searchview crashing and closing on typing in it

30 Views Asked by At
  • What are the correct lines of code for extracting string.xml data and creating a search view on a recycler view?

Main Activity Code:

    package com.example.search_view;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.widget.SearchView;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class MainActivity extends AppCompatActivity {
    
        ArrayList<SearchModel> searchModels = new ArrayList<SearchModel>();
        private RecyclerAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            RecyclerView recyclerView = findViewById(R.id.r1);
            setSearchModels();
            RecyclerAdapter adapter = new RecyclerAdapter(this, searchModels);
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
        }
    
              private void setSearchModels() {
            String [] itemNames = 
            getResources().getStringArray(R.array.search_items);
            for (int i=0;i<itemNames.length;i++) {
                searchModels.add(new SearchModel(itemNames[i]));
            }
    
    
        }
    
    
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main_menu,menu);
            MenuItem item=menu.findItem(R.id.s1);
            SearchView searchView = (SearchView) item.getActionView();
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }
    
                @Override
                public boolean onQueryTextChange(String  newText) {
                    adapter.getFilter().filter(newText);
    
    
                    return false;
                }
            });
    
    
            return super.onCreateOptionsMenu(menu)
        }
    }

Adapter Class:


    package com.example.search_view;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Filter;
    import android.widget.Filterable;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.appcompat.widget.SearchView;
    import androidx.recyclerview.widget.RecyclerView;
    
    import org.w3c.dom.Text;
    
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> implements Filterable {
    
        Context context;
        ArrayList<SearchModel> searchModels;
        ArrayList<SearchModel> backup;
    
        public RecyclerAdapter(Context context, 
            ArrayList<SearchModel>searchModels) {
            this.context = context;this.searchModels = searchModels;
            this.backup=new ArrayList<>(searchModels);
    
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater inflater=LayoutInflater.from(context);
            View view=inflater.inflate(R.layout.single_row,parent,false);
    
    
            return new RecyclerAdapter.MyViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.t1.setText(searchModels.get(position).getItemNames());
    
        }
    
        @Override
        public int getItemCount() {
            return searchModels.size();
        }
    
        @Override
        public Filter getFilter() {
            return filter;
        }
    
    
        Filter filter=new Filter() {
    
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                ArrayList<SearchModel> filteredList = new ArrayList<>();
                if(charSequence.toString().isEmpty()){
                    filteredList.addAll(backup);
                }else {
                    for(SearchModel obj : backup){
                        if(obj.getItemNames().toString().toLowerCase().contains(charSequence.toString().toLowerCase()))
                          filteredList.add(obj);
                        }
                    }
    
                FilterResults filterResults = new FilterResults();
                filterResults.values=filteredList;
                return filterResults;
            }
    
            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                searchModels.clear();
                searchModels.addAll((Collection<? extends SearchModel>) filterResults.values);
                notifyDataSetChanged();
    
    
            }
        };
    
    
        public static class MyViewHolder extends RecyclerView.ViewHolder {
    
            TextView t1;
            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                t1=itemView.findViewById(R.id.t1);
            }
        }
    }

  • I want someone to assist me regarding taking items from string.xml and creating a search view on an already framed recycler view as my app is closing and crashing as I type in the search view.
0

There are 0 best solutions below