listview searchview android 不进行搜索

listview searchview android doesn't do search

所以问题是,当我输入内容时,它不会搜索。我需要它来进行基本搜索,比如当我输入字母或数字时,它会对其进行过滤。

这是我的适配器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();
        }
    }
        }

这是我的 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;
                    }
                }
        );

    }
}

问题可能是您通过将 Kijiga.toString() 与您键入的内容进行比较来进行过滤,并且它可能没有您认为的 "content" 字符串。看看是什么toString returns,大概是这样的:“[Kijiga#1345]”。您可能想使用一些 getter 而不是 toString。或者重写 toString.

也可以尝试改:

    public boolean onQueryTextSubmit(String query) {
          adapter.getFilter().filter(query);
          return true;
    }

而且恕我直言,模拟器中存在一个错误,因此它并不总是有效(取决于硬件键盘设置),因此请在真实设备上进行测试!