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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With