【问题标题】:listview searchview android doesn't do searchlistview searchview android不做搜索
【发布时间】:2016-01-24 21:17:52
【问题描述】:

所以问题是当我输入一些东西时它就不会搜索。我需要它来进行基本搜索,例如当我输入字母或数字时它会过滤它。

这是我的适配器类:

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();
        }
    }
        }

这是我的活动课:

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;
                    }
                }
        );

    }
}

【问题讨论】:

    标签: android listview searchview android-filterable


    【解决方案1】:

    问题可能是您通过将Kijiga.toString() 与您键入的内容进行比较来进行过滤,并且它可能没有您认为的“内容”字符串。查看 toString 返回的内容,可能类似于:“[Kijiga#1345]”。您可能想要使用一些 getter,而不是 toString。或者覆盖 toString。

    也可以尝试改变:

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

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

    【讨论】:

    • 你能在第一行的 NameFilter.performFiltering 添加一个断点,看看你是否至少到达那里?如果是,则将断点移动到最后一行(返回结果;)并在键入时查看结果
    • 奇怪。 onQueryTextSubmit 和 onQueryTextChange 函数呢?当您开始输入搜索查询时,他们是否会被调用?
    • 确实如此。老实说,我输入的查询似乎与任何东西都不兼容,就像方法都搞砸了。可能会删除它并尝试其他方法。
    • 你的代码看起来和我的一样,在这里它可以工作。您说您从未到达 performFiltering 的第一行。即使您正在搜索任何东西(“不兼容”),它也应该去那里。
    • 感谢您的建议和帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多