2014-11-06 15 views
9

Ich bin sehr neu zu verwenden SearchView. Ich brauche eine Funktionalität, wo ich eine ActionBar habe, für die ich Search habe. Wenn ich auf Suchen klicke, sollten die Vorschläge in einer Liste unter dem Suchfeld angezeigt werden.SearchView Filtering und Set Vorschläge

Was ich bisher getan haben: Added Suche in menu.xml und schrieb den Code in onCreateOptionsMenu(), wo ich die Suche initialisieren und setSuggestionsAdapter auch setOnQueryTextListener implementieren.

Ergebnis: Ich gebe die App, klicken Sie auf Suche Symbol, es zeigt die Vorschläge. Ich tippe einen Buchstaben und sortiert die passenden aus. Ich tippe 2. Buchstaben, es zeigt keine Vorschläge. Außerdem schließe ich die Suche und öffne sie erneut, die Tastatur ist geöffnet, aber die Vorschläge in der Liste werden nicht angezeigt.

Was ich brauche: Filter nach benutzerdefinierten Zeichen eingegeben. Auch wenn es mehr als ein Zeichen ist. Zeige immer Vorschläge entweder standardmäßig eins mit allen Listenelementen oder diejenigen, die nach Benutzertyp sortiert sind.

Ich habe in der SearchView-Klasse von Android gesehen, sie setzen den Text leer und auch die Vorschläge zu entlassen. Aber ich will das nicht.

Ich bin hier stecken und weiß nicht weiter. Bitte hilf mir. Hier ist mein Adapter Code:

public class ExampleAdapter extends CursorAdapter implements Filterable { 

    private ArrayList<String> items; 
    private ArrayList<String> orig; 

    public ExampleAdapter(Context context, Cursor cursor, 
      ArrayList<String> items) { 
     super(context, cursor, false); 
     this.items = new ArrayList<String>(); 
     this.items = items; 
     orig = new ArrayList<String>(); 
     orig.addAll(items); 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @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 (int i = 0, l = orig.size(); i < l; i++) { 
         if (orig.get(i) 
           .toString() 
           .toLowerCase() 
           .startsWith(
             constraint.toString().toLowerCase())) 
          founded.add(orig.get(i)); 
        } 

        result.values = founded; 
        result.count = founded.size(); 
       } else { 
        synchronized (this) { 
         result.values = orig; 
         result.count = orig.size(); 
        } 

       } 
       return result; 

      } 

      @Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 

       items.clear(); 
       items = new ArrayList<String>(); 
       items = (ArrayList<String>) results.values; 
       notifyDataSetChanged(); 

      } 

     }; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.textView.setText(items.get(cursor.getPosition())); 
    } 

    public class ViewHolder { 
     public TextView textView; 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 
     View v = null; 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     v = inflater.inflate(R.layout.item, parent, false); 
     holder.textView = (TextView) v.findViewById(R.id.text); 

     v.setTag(holder); 
     return v; 

    } 
} 

-Code in meiner Tätigkeit zu Menü im Zusammenhang, wo ich Suche haben:

private String[] columns = new String[] { "_id", "text" }; 
    private SearchView searchView; 
    private SearchManager manager; 
    private ExampleAdapter aptr; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

} 

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     MenuItem searchItem = menu.findItem(R.id.action_search); 
     searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
     setSearchTextColour(searchView); 
     setSearchIcons(searchView); 
     searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" 
       + getResources().getString(R.string.search_store) + "</font>")); 
     searchView.setSearchableInfo(manager 
       .getSearchableInfo(getComponentName())); 
     Object[] temp = new Object[] { 0, "default" }; 
     final MatrixCursor cursor = new MatrixCursor(columns); 
     for (int i = 0; i < alStoreNames.size(); i++) { 
      temp[0] = i; 
      temp[1] = alStoreNames.get(i); 
      cursor.addRow(temp); 
     } 
     aptr = new ExampleAdapter(MainActivity.this, cursor, alStoreNames); 
     searchView.setSuggestionsAdapter(aptr); 

    searchView.setOnQueryTextListener(new OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String arg0) { 
      if (!TextUtils.isEmpty(arg0)) { 
       aptr.getFilter().filter(arg0.toString()); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(String arg0) { 
      return false; 
     } 
    }); 

    searchView.setOnSuggestionListener(new OnSuggestionListener() { 

      @Override 
      public boolean onSuggestionSelect(int arg0) { 
       return false; 
      } 

      @Override 
      public boolean onSuggestionClick(int position) { 
       String suggestion = getSuggestion(position); 
       db.openDatabase(); 
       String studentId = db.getStudentIdFromName(suggestion); 
       String studentImg = db.getStudentImgFromName(suggestion); 
       db.closeDatabase(); 
       Log.e("Sp", " On Click name -> " + aptr.getItem(position).toString() + " : " 
         + aptr.getCursor().getString(0) + " : " + suggestion); 
       Intent i = new Intent(MainActivity.this, 
         ExampleActivity.class); 
       i.putExtra("studentId", studentId); 
       i.putExtra("studentName", suggestion); 
       i.putExtra("studentImg", studentImg); 
       startActivity(i); 
       return true; 
      } 
     }); 

    return true; 
} 

private String getSuggestion(int position) { 
    Cursor cursor = (Cursor) searchView.getSuggestionsAdapter().getItem(
      position); 
    String suggest1 = cursor.getString(cursor.getColumnIndex("text")); 
    return suggest1; 
} 

private void setSearchTextColour(SearchView searchView) { 
     Field qTextField; 
     try { 
      qTextField = SearchView.class.getDeclaredField("mQueryTextView"); 
      qTextField.setAccessible(true); 
      SearchAutoComplete searchPlate = (SearchAutoComplete) qTextField 
        .get(searchView); 
      searchPlate.setTextColor(getResources().getColor(R.color.white)); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 
     catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

private void setSearchIcons(SearchView searchView) { 
    try { 
     Field searchField = SearchView.class 
       .getDeclaredField("mCloseButton"); 
     searchField.setAccessible(true); 
     ImageView closeBtn = (ImageView) searchField.get(searchView); 
     closeBtn.setImageResource(R.drawable.close); 

     Field searchField1 = SearchView.class 
       .getDeclaredField("mSearchButton"); 
     searchField1.setAccessible(true); 
     ImageView searchButton = (ImageView) searchField1.get(searchView); 
     searchButton.setImageResource(R.drawable.ic_action_search); 

    } catch (NoSuchFieldException e) { 
     Log.e("SearchView", e.getMessage(), e); 
    } catch (IllegalAccessException e) { 
     Log.e("SearchView", e.getMessage(), e); 
    } 
} 
+0

Filter ändern Code – Lokesh

+0

was zu ändern? Es gibt kein Problem mit der Filterung .. Problem ist mit onsuggestionclick – Lavanya

+0

Überprüfen Sie: http://StackOverflow.com/Questions/23422072/searchview-in-listview-having-a-custom-adapter/23422665#23422665 –

Antwort

2

Es dass ein Teil des Problems mir scheint, ist in Abwesenheit des Verfahrens getItem().

Wenn Sie den Quelltext des Cursor-Adapters betrachten, erhält getItem() die Daten vom Cursor, nicht von Ihrer gefilterten Liste, sondern von der gefilterten Liste!

Try this:

@Override 
public Object getItem(int position) { 
    if (position < items.size()) {    
     return items.get(position); 
    } else { 
     return null; 
    } 
} 

i hinzufügen, vergessen zu sein, müssen Sie auch diese ändern:

private String getSuggestion(int position) { 
    String suggest1 = (String) searchView.getSuggestionsAdapter().getItem(position);  
    return suggest1; 
} 

Und alles zu schließen, zuerst fügen Sie diese createOptions Menü:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    searchView.setIconifiedByDefault(true); //this line 

    ... 

dann fügen Sie diese onSuggestionClick hinzu:

@Override 
public boolean onSuggestionClick(int position) { 
    String suggestion = getSuggestion(position); 
    db.openDatabase(); 
    String studentId = db.getStudentIdFromName(suggestion); 
    String studentImg = db.getStudentImgFromName(suggestion); 
    db.closeDatabase(); 
    Log.e("Sp", " On Click name -> " + aptr.getItem(position).toString() + " : " 
     + aptr.getCursor().getString(0) + " : " + suggestion); 

    searchView.setIconified(true);//this line 


    Intent i = new Intent(MainActivity.this,ExampleActivity.class); 
    i.putExtra("studentId", studentId); 
    i.putExtra("studentName", suggestion); 
    i.putExtra("studentImg", studentImg); 
    startActivity(i); 
    return true; 
} 

Ein bisschen eine Erklärung.Wenn Sie setIconified aufrufen, wird der Text Ihrer searchView entweder gelöscht oder in Abhängigkeit vom Standardstatus ausgeblendet. Was wir dort gemacht haben, wurde als Standardzustand auf "iconified" gesetzt. Wenn wir die setIconified-Methode aufrufen, wird der Text gelöscht und die Ansicht minimiert.

2

Hallo ich einige Probleme mit Ihrem Code gefunden. Bitte versuchen Sie meinen Weg. publishResults of ExampleAdapter ersetzen

@Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 

       items.clear(); 
       // items = new ArrayList<String>(); 
       //items = (ArrayList<String>) results.values; 
       items.addAll((ArrayList<String>) results.values); 
       notifyDataSetChanged(); 

      } 

UND

searchView.setOnQueryTextListener(new OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String arg0) { 
      if (!TextUtils.isEmpty(arg0)) { 
       aptr.getFilter().filter(arg0.toString()); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(String arg0) { 
if (!TextUtils.isEmpty(arg0)) { 
       aptr.getFilter().filter(arg0.toString()); 
return true; 
      } 
      return false; 
     } 
    }); 
+0

, die die Liste der Vorschläge gelöst Problem. Aber wenn ich auf eines der Elemente aus der sortierten Vorschlagsliste klicke, zeigt es auf eine alte Zeichenfolge in dieser Position – Lavanya

+0

make cursoradapter global und versuche, adapter.getItem (position) zu verwenden; –

+0

Ich habe onSuggestionClick, wo, wenn ich klicke, gibt es den Namen der angeklickte Zeichenfolge – Lavanya

0

Versuchen Suchwert zu passieren sogar leer zu filtern:

@Override 
public boolean onQueryTextSubmit(String arg0) { 
    aptr.getFilter().filter(arg0.toString()); 
    return true; 
} 

Set Standardliste Adapter, wenn diese Suche gefunden oder Suchwert ist leer:

@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 (int i = 0, l = orig.size(); i < l; i++) { 
       if (orig.get(i).toString().toLowerCase().startsWith(constraint.toString().toLowerCase())) 
          founded.add(orig.get(i)); 
      } 

      if(founded.size()>0){ 
      result.values = founded; 
      result.count = founded.size(); 
      }else{ 
      result.values = orig; 
      result.count = orig.size(); 
      } 
     } else { 
      result.values = orig; 
      result.count = orig.size(); 
     } 
     return result; 

}