2012-12-26 14 views
19

Zaimplementowałem filtr wyszukiwania w moim SearchView na moim pasku SherlockAction.Android SearchView Filter ListView

Po wpisaniu m chcę pokazać przefiltrowane wyniki w poniższym widoku listy, który zaczyna się tylko od M i tak dalej. Ale teraz pokazuje losowe wyniki.

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

Odpowiedz

19

Place to wewnątrz adaptera:

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

    } 

    } 
    } 

i to wewnątrz konstruktora adaptera

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

również chcę się upewnić, że tekst, który filtruje, jest tylko w tekście szczegółowym. Myślę, że brakuje jakiegoś kodu lub jego format nie jest sformatowany. czy możesz edytować odpowiedź: –

+0

czy to lepiej? – Greensy

+0

Po prostu zauważyłem, że używasz obiektu Array, ale przekazuję ciąg Array do mojego adaptera. Więc wszystko, co muszę zrobić, to przekonwertować obiekt na ciąg znaków –

1

Dodaj element w listview_arr i kod reszta jest poniżej ...: -

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

można po prostu przejść przez to example. to jest bardzo łatwe do zintegrowania w aplikacji

Oto logika z tablicy i addTextChangedListener dla EditText

5

Get filtr od zasilacza i filtrować vy ciąg zmieniło w dziedzinie seachview na zapytania zmieniło.

searchView.setOnQueryTextListener(new OnQueryTextListener() { 

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

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