【问题标题】:Android SearchView Filter ListViewAndroid SearchView 过滤 ListView
【发布时间】:2012-12-11 21:04:56
【问题描述】:

我已经在我的 SherlockAction Bar 中为我的 SearchView 实施了搜索过滤器。

当我键入 m 时,我想在下面的列表视图中显示过滤结果,该列表视图仅以 M 开头,依此类推。但现在它显示的是随机结果。

public boolean onQueryTextChange(String newText) {
    Log.i("Nomad", "onQueryTextChange");

    if (TextUtils.isEmpty(newText)) {
        adapter.getFilter().filter("");
        Log.i("Nomad", "onQueryTextChange Empty String");
        placesListView.clearTextFilter();
    } else {
        Log.i("Nomad", "onQueryTextChange " + newText.toString());
        adapter.getFilter().filter(newText.toString());
    }
    return true;
}

public boolean onQueryTextSubmit(String query) {
    Log.i("Nomad", "onQueryTextSubmit");
    return false;
}

public boolean onClose() {
    Log.i("Nomad", "onClose");
    return false;
}

【问题讨论】:

    标签: android searchview


    【解决方案1】:

    从适配器获取过滤器,并根据查询更改时 seachview 字段中更改的字符串进行过滤。

    searchView.setOnQueryTextListener(new OnQueryTextListener() {
    
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String newText) {
                getListAdapter().getFilter().filter(newText);
                return true;
            }
        });
    

    【讨论】:

    • 当列表被清空而不是被过滤时我该怎么办?
    • 我想这取决于你想要达到的效果,也许隐藏它直到你有内容过滤显示
    • 什么是 getListAdapter() ?我有ArrayList<String> array_list = new ArrayList<>(); ArrayAdapter arrayAdapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, array_list);,当我用arrayAdapter 更改getListAdapter() 时,我收到了这个错误non static method cannot be referenced from a static context 真的希望你能提供帮助,我正在寻找我们在片段中的列表视图中进行简单搜索但没有成功
    【解决方案2】:

    把它放在你的适配器里面:

    @Override
    public Filter getFilter(){
       return new Filter(){
    
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                 constraint = constraint.toString().toLowerCase();
                 FilterResults result = new FilterResults();
    
                    if (constraint != null && constraint.toString().length() > 0) {
                      List<String> founded = new ArrayList<String>();
                            for(YourListItemType item: origData){
                                if(item.toString().toLowerCase().contains(constraint)){
                                    founded.add(item);
                                }
                        }
    
                            result.values = founded;
                            result.count = founded.size();
                        }else {
                            result.values = origData;
                            result.count = origData.size();
                        }
                return result;
    
    
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
               clear();
               for (String item : (List<String>) results.values) {
                     add(item);
               }
        notifyDataSetChanged();
    
        }
    
        }
        }
    

    你的适配器的内部构造函数

    public MyAdapter(Context context, int layoutResourceId, String[] places) {
            super(context, layoutResourceId, data);
            this.context = context;
    
            this.data = Arrays.asList(places);
            this.origData = new ArrayList<String>(this.data);
    
     }
    

    【讨论】:

    • 我还想确保它过滤的文本仅是分词文本。我认为您的某些代码丢失或未格式化。你能编辑你的答案吗
    • 我刚刚注意到你正在使用一个数组对象,但我正在将一个字符串数组传递给我的适配器。所以我需要做的就是将对象转换为字符串
    • 是的,YourListItemType - 意味着您可以随意放置任何东西
    • 你应该用你的类型覆盖适配器方法中的 add()
    • Greensy,如果您使用“扩展 ArrayAdapter”参数化 ArrayAdapter,则无需在 arrayadapter 中覆盖 add()。此外,除非您删除所有字符,否则您的代码不适用于过滤框中已删除的字符。所以我的建议是使用“for (YourListItemType item: origData)”而不是“for (YourListItemType item: data)”,因为过滤过程会修改数据。
    【解决方案3】:

    你可以简单地通过这个example。它很容易集成到您的应用程序中

    这里是数组和 addTextChangedListener 用于 EditText 的逻辑

    【讨论】:

      【解决方案4】:

      在listview_arr中添加元素,其余代码如下...:-

          listview_arr = new String[listview_array_location.length];
          listview_arr = listview_array;
      
          setListAdapter(new bsAdapter(this));
      
      
          et.addTextChangedListener(new TextWatcher()
          {
              public void afterTextChanged(Editable s)
              {
                    // Abstract Method of TextWatcher Interface.
              }
              public void beforeTextChanged(CharSequence s,
                      int start, int count, int after)
              {
                  // Abstract Method of TextWatcher Interface.
              }
              public void onTextChanged(CharSequence s,int start, int before, int count)
              {
                  /*Log.d("count","count==>"+s.length());
      
                      if(((s.length()-temp)%4)==0)
                      {
                          Log.d("in if","if in if"+(s.length()-temp));
                          et.setText(et.getText().toString()+" ");
                          int position = et.getText().toString().length();
                          Editable etext = et.getText();
                          Selection.setSelection(etext, position);
                          temp++;
                      }*/
      
                  Log.d("count","count==>"+s);
                  textlength = et.getText().length();
                  array_sort.clear();
                  for (int i = 0; i < listview_array_location.length; i++)
                  {
                      if (textlength <= listview_array_location[i].length())
                      {
                          if(et.getText().toString().equalsIgnoreCase((String)listview_array_location[i].subSequence(0,textlength)))
                          {
                              array_sort.add(listview_array[i]);
                          }
                        }
                  }
                  AppendList(array_sort);
              }
          });
      }
      
      public void AppendList(ArrayList<String> str)
      {
          listview_arr = new String[str.size()];
          listview_arr = str.toArray(listview_arr);
      
          setListAdapter(new bsAdapter(this));
      }
      
      public class bsAdapter extends BaseAdapter
      {
          Activity cntx;
          public bsAdapter(Activity context)
          {
              // TODO Auto-generated constructor stub
              this.cntx=context;
      
          }
      
          public int getCount()
          {
              // TODO Auto-generated method stub
              return listview_arr.length;
          }
      
          public Object getItem(int position)
          {
              // TODO Auto-generated method stub
              return listview_arr[position];
          }
      
          public long getItemId(int position)
          {
              // TODO Auto-generated method stub
              return listview_array.length;
          }
      
          public View getView(final int position, View convertView, ViewGroup parent)
          {
              View row=null;
      
              LayoutInflater inflater=cntx.getLayoutInflater();
              row=inflater.inflate(R.layout.search_list_item, null);
      
              TextView tv=(TextView)row.findViewById(R.id.title);
              Button Btn01=(Button)row.findViewById(R.id.Btn01);
              Button Btn02=(Button)row.findViewById(R.id.Btn02);
      
              tv.setText(listview_arr[position]);
      
              Btn01.setOnClickListener(new OnClickListener()
              {
                  public void onClick(View v)
                  {
                      Toast.makeText(SearchUser.this, "Button 1 "+listview_arr[position], Toast.LENGTH_SHORT).show();
                        int color = PreferenceManager.getDefaultSharedPreferences(
                                SearchUser.this).getInt(COLOR_PREFERENCE_KEY, Color.WHITE);
                        new ColorPickerDialog(SearchUser.this, SearchUser.this, color).show();
                  }
               });
      
              Btn02.setOnClickListener(new OnClickListener()
              {
                  public void onClick(View v) 
                  {
                      Toast.makeText(SearchUser.this, "Button 2 "+listview_arr[position], Toast.LENGTH_SHORT).show();
                  }
               });
      
          return row;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多