So the problem is that when I type in something it just won't search. I need it to do basic search like when I type a letter or number it will filter it.
This is my Adapter class:
public class KnjigeSearchAdapter extends ArrayAdapter<Knjiga> implements Filterable{
Context context;
private ArrayList<Knjiga> originalValues;
private NameFilter filter;
ArrayList<Knjiga> podaci = new ArrayList<>();
public KnjigeSearchAdapter(Context context,ArrayList<Knjiga> knjigas){
super(context, 0, knjigas);
this.context = context;
this.podaci = knjigas;
this.originalValues = new ArrayList<>();
this.originalValues.addAll(podaci);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Knjiga knjiga = getItem(position);
if (convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.search_knjiga_layout, parent, false);
}
TextView tvnazivK = (TextView)convertView.findViewById(R.id.textViewNazivKnjige);
TextView tvautorK = (TextView)convertView.findViewById(R.id.textViewAutorKnjige);
TextView tvisbn = (TextView)convertView.findViewById(R.id.textViewIsbnKnjige);
TextView tvGodina = (TextView)convertView.findViewById(R.id.textViewGodinaIzdKnjige);
TextView tvkatK = (TextView)convertView.findViewById(R.id.textViewKategorijaKnjige);
tvnazivK.setText(knjiga.getNaziv());
tvautorK.setText(knjiga.getAutor());
tvisbn.setText(knjiga.getIsbn());
tvGodina.setText(String.valueOf(knjiga.getGodinaIzdavanja()));
tvkatK.setText(knjiga.getKategorija());
return convertView;
}
@Override
public Filter getFilter() {
if(filter == null){
filter = new NameFilter();
}
return filter;
}
private class NameFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
if(constraint != null && constraint.toString().length() > 0)
{
ArrayList<Knjiga> filtrirano = new ArrayList<>();
for(int i = 0, l = originalValues.size(); i < l; i++)
{
Knjiga knjiga = originalValues.get(i);
if(knjiga.toString().toLowerCase().contains(constraint))
filtrirano.add(knjiga);
}
results.count = filtrirano.size();
results.values = filtrirano;
}
else
{
synchronized(this)
{
results.values = originalValues;
results.count = originalValues.size();
}
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
podaci = (ArrayList<Knjiga>)results.values;
notifyDataSetChanged();
clear();
for(int i = 0, l = podaci.size(); i < l; i++)
add(podaci.get(i));
notifyDataSetInvalidated();
}
}
}
This is my Activity class:
public class KorisnikSearchKnjigeActivity extends AppCompatActivity {
ListView lvPretragaknjiga;
SearchView svSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_korisnik_search_knjige);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
pretragaKnjiga();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void pretragaKnjiga() {
lvPretragaknjiga = (ListView) findViewById(R.id.listViewListaKnjiga);
svSearch = (SearchView) findViewById(R.id.searchViewSearch);
MyDBHelper helper = new MyDBHelper(this);
final KnjigeSearchAdapter adapter = new KnjigeSearchAdapter(this, helper.getAllKnjige());
lvPretragaknjiga.setAdapter(adapter);
svSearch.setOnQueryTextListener(
new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
}
);
}
}
The problem might be that you're filtering by comparing Kijiga.toString()
to what you typed, and probably it doesn't have the "content" string you think it has. See what toString returns, probably something like: "[Kijiga#1345]". Instead of toString, you might want to use some getter. Or override toString.
Also could try to change:
public boolean onQueryTextSubmit(String query) {
adapter.getFilter().filter(query);
return true;
}
And IMHO there's a bug in the emulator, so it will not always work (depending on the HW keyboard settings), so test it on a real device!