列表视图数组过滤器

时间:2014-11-09 17:02:39

标签: android android-listview arrays android-filter

我有json数组,我将数组的所有项目都放在列表中。我需要的是搜索此列表。我试过这个功能

 // Locate the EditText in listview_main.xml
    final EditText  editsearch = (EditText) findViewById(R.id.editText1);
    // Capture Text in EditText
    editsearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

            String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
            adapter1.filter(text);

        }
    });

但是当我尝试输入任何内容时,列表变为空白

我在自定义列表适配器中有我的过滤器,如下所示

// Filter Class
       public void filter(String charText) {
       charText = charText.toLowerCase(Locale.getDefault());
       movieItems.clear();
       if (charText.length() == 0) {
       movieItems.addAll(movieItems);
       } 
       else 
      {
       for (Movie wp : movieItems) 
       {
           if (wp.getNAME().toLowerCase(Locale.getDefault()).contains(charText)) 
           {
               movieItems.add(wp);
           }
       }
   }
   notifyDataSetChanged();
   }  

我该如何解决?

3 个答案:

答案 0 :(得分:0)

您在clear之前呼叫addAll,因此您要添加一个空列表。创建一个临时的“filteredList”并保存对“originalList”的引用

// Filter Class
   public void filter(String charText) {
       charText = charText.toLowerCase(Locale.getDefault());
       List<Movie> filteredMovies = new ArrayList<Movie>();
       if (charText.length() == 0) {
           filteredMovies.addAll(originalMovieList);
       } 
       else 
       {
           for (Movie wp : movieItems) 
               if (wp.getNAME().toLowerCase(Locale.getDefault()).contains(charText)) 
                   filteredMovies.add(wp);
       }
       notifyDataSetChanged();       
   }

请记住,您的自定义适配器必须处理filteredList而不是原始

答案 1 :(得分:0)

如果没有看到整个适配器代码,很难说出你的问题究竟是什么。但是,您似乎在自定义适配器中手动实现了一个名为filter()的方法?您的自定义适配器(假设它正在扩展BaseAdapter)应该实现Filterable接口,然后您可以访问该接口以执行过滤搜索。

滚动自己的解决方案可能很困难。我建议查看https://github.com/JaySoyer/Advanced-Adapters回购。它包含一堆适配器,它们提供了一种非常简单的方法来定义自己的过滤逻辑。还有一个专门用于与JSONArrays一起使用。

答案 2 :(得分:0)

基本上,您的过滤列表与主过滤列表不同,并存储所有过滤后的结果。

当您输入搜索字词时,已过滤的列表会包含所有结果。将此列表设置为adapter,然后使用新列表调用notifydatasetchanged()。