Je veux implémenter SearchView
sur la barre d'outils dans Navigation-Drawer
et il y a Fragment Activity
comme dans l'image. J'ai essayé SearchView
sur Activity
et j'ai réussi, mais quand je l'implémente à Fragment Activity
, pourquoi son code ne peut pas fonctionner.Implémenter Searchview avec le tiroir de navigation et le fragment à l'intérieur
Ceci est mon Main Activity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
public static final String MAKAN = "makanan";
public static String WHERE = "makanan";
public static int WHERE2;
String mQuery;
ArrayList<Makanan> mlist = new ArrayList<>();
ArrayList<Makanan> mlistAll = new ArrayList<>();
public String mQuery2;
boolean isFiltered;
MakananAdapter mAdapter;
ArrayList<Integer> mListMapFilter = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View header = ((NavigationView)findViewById(R.id.nav_view)).getHeaderView(0);
ImageButton ib = (ImageButton)header.findViewById(R.id.imageButton);
ib.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MapsActivity.class);
startActivity(intent);
}
});
setTitle("Beranda");
Hal1 fragment = new Hal1();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, fragment, "fragment1");
//WHERE = "11";
fragmentTransaction.commit();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
setTitle("About");
Hal2 fragments = new Hal2();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, fragments, "fragment1");
fragmentTransaction.commit();
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.frag_all) {
setTitle("Rekomendasi");
SecondFragment fragment = new SecondFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, fragment, "fragment1");
WHERE = "11";
fragmentTransaction.commit();
} ...
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}}
Et Mon SecondFragment.java
public class SecondFragment extends Fragment implements MakananAdapter.IMakananAdapter, SearchView.OnQueryTextListener {
public static final String MAKAN = "makanan";
private AppCompatActivity compat;
private RecyclerView recyclerView;
private MakananAdapter adapter;
public SecondFragment() {
// Required empty public constructor
}
ArrayList<Makanan> mList = new ArrayList<>();
//MakananAdapter mAdapter;
String mQuery;
ArrayList<Makanan> mlist = new ArrayList<>();
ArrayList<Makanan> mlistAll = new ArrayList<>();
boolean isFiltered;
MakananAdapter mAdapter;
ArrayList<Integer> mListMapFilter = new ArrayList<>();
private SearchView searchView = null;
private SearchView.OnQueryTextListener queryTextListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.activity_calling, container, false);
recyclerView = (RecyclerView) rootview.findViewById(R.id.recyclerView);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
recyclerView .setHasFixedSize(true);
recyclerView .setItemAnimator(new DefaultItemAnimator());
recyclerView .setLayoutManager(gridLayoutManager);
recyclerView.setLayoutManager(gridLayoutManager);
adapter = new MakananAdapter(mList);
recyclerView.setAdapter(adapter);
return rootview;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
fillData1();
//if i use this call method, the function is work
//[enter image description here][1]doFilter("roker");
}
private void fillData1() {
Resources resources = getResources();
String[] arJudul = resources.getStringArray(R.array.recommend);
String[] arDeskripsi = resources.getStringArray(R.array.recommend_desc);
String[] arHarga = resources.getStringArray(R.array.recommend_price);
String[] arDetail = resources.getStringArray(R.array.recommend_details);
String[] arLokasi = resources.getStringArray(R.array.recommend_locations);
String[] arLat = resources.getStringArray(R.array.recommend_lat);
String[] arLng = resources.getStringArray(R.array.recommend_longi);
TypedArray a = resources.obtainTypedArray(R.array.recommend_pict);
String[] arFoto = new String[a.length()];
for (int i = 0; i < arFoto.length; i++) {
int id = a.getResourceId(i, 0);
arFoto[i] = ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
+ resources.getResourcePackageName(id) + '/'
+ resources.getResourceTypeName(id) + '/'
+ resources.getResourceEntryName(id) + '/';
}
a.recycle();
for (int i = 0; i < arJudul.length; i++) {
mList.add(new Makanan(arJudul[i], arDeskripsi[i], arFoto[i], arHarga[i], arDetail[i], arLokasi[i], arLat[i], arLng[i]));
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setQueryHint("Cari");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//Log.i("onQueryTextSubmit", query);
//mQuery = query.toLowerCase();
//doFilter(mQuery);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Log.i("onQueryTextChange", newText);
mQuery = newText.toLowerCase();
doFilter(mQuery);
return true;
}
});
return;
}
//My filter function goes here
public boolean doFilter(String query) {
if (!isFiltered) {
mlistAll.clear();
mlistAll.addAll(mList);
isFiltered = true;
}
mList.clear();
if (query.isEmpty()) {
mList.addAll(mlistAll);
isFiltered = false;
return false;
} else {
mListMapFilter.clear();
for (int i = 0; i < mlistAll.size(); i++) {
Makanan makanan = mlistAll.get(i);
if (makanan.judul.toLowerCase().contains(query) ||
makanan.deskripsi.toLowerCase().contains(query)) {
mList.add(makanan);
mListMapFilter.add(i);
}
}
return true;
}
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
@Override
public void doClick(int pos) {
Intent intent = new Intent(getContext(), DetailActivity.class);
intent.putExtra(MAKAN, mList.get(pos));
startActivity(intent);
}}
Alors, ma question est de savoir comment exécuter la fonction doFilter
avec requête en entrée utilisateur? Est-ce possible ? merci à l'avance
lien image [1]: https://ibb.co/fFO3gQ - doFilter fonctionne pas [2]: https://ibb.co/dYXw1Q - travail doFilter statique
mais impossible d'ajouter 'public static void' sur un fragment, car la fonction de if (! IsFiltered) jusqu'à la fin de l'instruction sera rouge (erreur) –