2012-12-26 21 views
19

Ho implementato il filtro di ricerca sul mio SearchView nella mia barra SherlockAction.Android SearchView Filter ListView

Quando digito m voglio mostrare i risultati filtrati nella visualizzazione elenco sotto che inizia solo con M e così via. Ma ora mostra risultati casuali.

enter image description here enter image description here

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

risposta

19

Luogo questo all'interno la scheda:

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

    } 

    } 
    } 

E questo costruttore all'interno della scheda

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

} 
+0

inoltre voglio essere sicuro che il testo che filtra sia solo di un testo particolare. Penso che un po 'del codice U manchi o non sia formattato. puoi per favore modificare la risposta –

+0

è meglio? – Greensy

+0

Ho appena notato che stai usando un oggetto Array ma sto passando una stringa Array nel mio Adapter. Quindi tutto ciò che devo fare è convertire l'oggetto in stringa –

1

Aggiungi l'elemento in listview_arr e il codice resto è in basso ...: -

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

si può semplicemente passare attraverso questo example. è molto facile da integrare nella propria applicazione

Ecco la logica con array e addTextChangedListener per EditText

5

Prendi il filtro dall'adattatore e filtrare vy la stringa cambiato nel campo seachview su interrogazione cambiato.

searchView.setOnQueryTextListener(new OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      getListAdapter().getFilter().filter(newText); 
      return true; 
     } 
    });