Separate searchview for fragments

android, fragment, searchview

Solution

Its been quite a while but still if anyone is finding the same problem, here's how i managed to do that .

Just implement onPrepareOptionsMenu() in each of your fragments and inside of it, call onQueryTextChange(""); passing "" as query string.

Problem

I have a simple activity which holds a tabbar to switch two fragments. The two fragments are both a listFragment and implement a searchview to make searching possible within the listfragment. The searchview is always shown in the actionbar above the tabbar. The problem I have is that the input of the searchview isn’t reset once I switch the tab (go to other fragment). Therefore, the second fragment reads the input from the searchview and filters the listfragment accordingly, which actually reads the input I entered when I was still in fragment one. What I want is the searchview to be a separate searchview for both fragments. Is there a way to achieve this? Here is my code: Activity ``` public class ActivityMainApp extends Activity implements ActionBar.TabListener { private FragmentManager fragmentManager = getFragmentManager(); @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.mainapp); ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Add tabs ActionBar.Tab relatieTab = actionBar.newTab().setText("Relaties"); ActionBar.Tab takenTab = actionBar.newTab().setText("Taken"); //ActionBar.Tab urenTab = actionBar.newTab().setText("Uren"); // Listeners relatieTab.setTabListener(this); takenTab.setTabListener(this); // Tabs toevoegen aan actionbar actionBar.addTab(relatieTab); actionBar.addTab(takenTab); // Create fragmentmanager to switch fragments FragmentTransaction fragmentTransaction = this.fragmentManager.beginTransaction(); Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_content); if(fragment == null){ FragmentTransaction ft = fragmentManager.beginTransaction(); ft.add(R.id.fragment_content, new FragRelaties()); } } public void onTabSelected(Tab tab, FragmentTransaction ft) { FragmentTransaction fragmentTransaction = this.fragmentManager.beginTransaction(); if(tab.getText().equals("Taken")){ FragTaken fragment = new FragTaken(); fragmentTransaction.replace(R.id.fragment_content, fragment); fragmentTransaction.commit(); } if(tab.getText().equals("Relaties")){ FragRelaties fragment = new FragRelaties(); fragmentTransaction.replace(R.id.fragment_content, fragment); fragmentTransaction.commit(); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { } public void onTabReselected(Tab tab, FragmentTransaction ft) { } } ``` Fragment one ``` public class FragRelaties extends ListFragment implements SearchView.OnQueryTextListener { private LayoutInflater inflater; private ModelRelatie modelRelatie; private AdapterRelatie relatieAdapter; public ArrayList<Relatie> relaties; public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.inflater = inflater; Activity activity = getActivity(); final Context context = activity.getApplicationContext(); setHasOptionsMenu(true); new AsyncTask<Void, Void, ArrayList<Relatie>>(){ protected ArrayList<Relatie> doInBackground(Void... params) { // Get all my contacts modelRelatie = ModelRelatie.instantiate(context); ArrayList<Relatie> relaties = modelRelatie.getRelaties(); return relaties; } protected void onPostExecute(ArrayList<Relatie> relaties) { // Initial input of objects in the list relatieAdapter = new AdapterRelatie(inflater.getContext(), R.layout.relatieslijstitem, relaties); setListAdapter(relatieAdapter); } }.execute(); View view = inflater.inflate(R.layout.relaties, container, false); return view; } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.relatie_menu, menu); // Get the searchview MenuItem zoekveld = menu.findItem(R.id.zoekveld_fragrelatie); SearchView zoekview = (SearchView) zoekveld.getActionView(); // Execute this when searching zoekview.setOnQueryTextListener(this); super.onCreateOptionsMenu(menu, inflater); } public void onListItemClick(ListView l, View v, int position, long id) { // Things that happen when i click on an item in the list } public boolean onQueryTextSubmit(String query) { return true; } public boolean onQueryTextChange(String zoekterm) { Activity activity = getActivity(); Context context = activity.getApplicationContext(); // We start searching for the name entered ModelRelatie modelRelatie = ModelRelatie.instantiate(context); ArrayList<Relatie> relaties = modelRelatie.zoekRelatie(zoekterm); // The returned objects are placed in the list this.relatieAdapter = new AdapterRelatie(inflater.getContext(), R.layout.relatieslijstitem, relaties); setListAdapter(relatieAdapter); return true; } ``` Fragment Two ``` public class FragTaken extends ListFragment implements SearchView.OnQueryTextListener { private LayoutInflater inflater; private AdapterTaak adapterTaak; private ModelTaken modelTaken; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { this.inflater = inflater; Activity activity = getActivity(); final Context context = activity.getApplicationContext(); setHasOptionsMenu(true); this.modelTaken = ModelTaken.instantiate(context); ArrayList<Taak> taken = modelTaken.getTaken(); // Initial input for the list adapterTaak = new AdapterTaak(inflater.getContext(), R.layout.takenlijstitem, taken); setListAdapter(adapterTaak); View view = inflater.inflate(R.layout.taken, container, false); return view; } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.taken_menu, menu); // get the searview MenuItem zoekveld = menu.findItem(R.id.zoekveld_fragtaken); SearchView zoekview = (SearchView) zoekveld.getActionView(); // Execute this when searching zoekview.setOnQueryTextListener(this); super.onCreateOptionsMenu(menu, inflater); } public boolean onQueryTextSubmit(String query) { return true; } public boolean onQueryTextChange(String zoekterm) { Activity activity = getActivity(); Context context = activity.getApplicationContext(); // Search the task by the inputed value ModelTaken modelTaken = ModelTaken.instantiate(context); ArrayList<Taak> taken = modelTaken.zoekTaak(zoekterm); // Return the found items to the list this.adapterTaak = new AdapterTaak(inflater.getContext(), R.layout.takenlijstitem, taken); setListAdapter(adapterTaak); return true; } } ``` Both fragments are almost identical except the searching part.

Original source