Android-Suchliste während des Tippens
-
24-09-2019 - |
Frage
Wie kann ich eine Suchleiste bauen, wo während ich die Ergebnisse tippen bin in den ListView
gezeigt, in der ich suche?
Zum Beispiel habe ich eine Listenansicht mit 20 Saiten. Ich drücke den Suchschlüssel und erscheinen an der Latte. Ich möchte, wenn ich 3 Wörter eingeben oder mehr die Suche zu laufen beginnt, die Ergebnisse in der Listenansicht zeigt (als Filter: zeigt nur die Strings in der Liste das passende was ich schreibe)
Lösung
Sie können dies nicht mit der Suchleiste. Aber die Listview hat eine Möglichkeit, Filter auf Taste , wie es in den Kontakten erfolgt. Der Benutzer startet einfach mit der Eingabe und die Liste wird dann filtriert. Das Filtern ist nicht wirklich wie die Suche. Wenn Sie Liste enthält das Wort foo irgendwo und Sie oo foo Typ herausgefiltert werden, aber wenn Sie geben fo es auch bleiben, wenn das Listenelement Anruf bar foo ist.
Sie einfach es ermöglichen, haben:
ListView lv = getListView();
lv.setTextFilterEnabled(true);
Ich weiß nicht, wie dies geschehen ist, wenn Sie nicht über eine Hardware-Tastatur. Ich bin die Droiden mit und Typ Start beginnt die Liste zu filtern und zu zeigen, nur passende Ergebnisse.
Andere Tipps
Ich glaube, das ist das, was Sie suchen:
Haben Sie Ihre Aktivität SearchView.OnQueryTextListener implementieren
und fügen Sie die folgenden Methoden:
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
mListView.clearTextFilter();
} else {
mListView.setFilterText(newText.toString());
}
return true;
}
public boolean onQueryTextSubmit(String query) {
return false;
}
Ich habe eine EditText
die Arbeit zu tun.
Zuerst habe ich erstellt zwei Kopien des Arrays die Liste der Daten zu halten suchen:
List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;
Wenn ich meine Liste Daten von irgendwo habe ich kopieren:
for(Map<String,String>map : vehicleinfo)
{
vehicleinfodisplay.add(map);
}
und eine SimpleAdapter
verwenden, um die Anzeige (kopiert) Version meiner Daten angezeigt werden:
String[] from={"vehicle","dateon","dateoff","reg"};
int[] to={R.id.vehicle,R.id.vehicledateon,R.id.vehicledateoff,R.id.vehiclereg};
listadapter=new SimpleAdapter(c,vehicleinfodisplay,R.layout.vehiclelistrow,from,to);
vehiclelist.setAdapter(listadapter);
Dann hat ich eine TextWatcher
zum EditText
, die durch das Löschen der Anzeigeversion der Liste auf ein afterTextChanged
Ereignis reagiert und dann das Hinzufügen wieder nur die Elemente aus der anderen Liste, dass erfüllt die Suchkriterien (in diesem Fall des „reg“ -Feld enthält die Suchzeichenfolge). Sobald die Anzeigeliste mit der gefilterten Liste aufgefüllt wird, nenne ich nur notifyDataSetChanged
auf der SimpleAdapter
Liste.
searchbox.addTextChangedListener(new TextWatcher()
{
@Override
public void afterTextChanged(Editable s)
{
vehicleinfodisplay.clear();
String search=s.toString();
for(Map<String,String>map : vehicleinfo)
{
if(map.get("reg").toLowerCase().contains(search.toLowerCase()))
vehicleinfodisplay.add(map);
listadapter.notifyDataSetChanged();
}
};
... other overridden methods can go here ...
});
Hope Dies ist hilfreich für jemanden.
Verwenden Sie folgenden Code Such- und Filterliste in Android implementieren:
SearchAndFilterList.java
public class SearchAndFilterList extends Activity {
private ListView mSearchNFilterLv;
private EditText mSearchEdt;
private ArrayList<String> mStringList;
private ValueAdapter valueAdapter;
private TextWatcher mSearchTw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_and_filter_list);
initUI();
initData();
valueAdapter=new ValueAdapter(mStringList,this);
mSearchNFilterLv.setAdapter(valueAdapter);
mSearchEdt.addTextChangedListener(mSearchTw);
}
private void initData() {
mStringList=new ArrayList<String>();
mStringList.add("one");
mStringList.add("two");
mStringList.add("three");
mStringList.add("four");
mStringList.add("five");
mStringList.add("six");
mStringList.add("seven");
mStringList.add("eight");
mStringList.add("nine");
mStringList.add("ten");
mStringList.add("eleven");
mStringList.add("twelve");
mStringList.add("thirteen");
mStringList.add("fourteen");
mSearchTw=new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
valueAdapter.getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};
}
private void initUI() {
mSearchNFilterLv=(ListView) findViewById(R.id.list_view);
mSearchEdt=(EditText) findViewById(R.id.txt_search);
}
}
Benutzerdefinierte Wert Adapter: ValueAdapter.java
public class ValueAdapter extends BaseAdapter implements Filterable{
private ArrayList<String> mStringList;
private ArrayList<String> mStringFilterList;
private LayoutInflater mInflater;
private ValueFilter valueFilter;
public ValueAdapter(ArrayList<String> mStringList,Context context) {
this.mStringList=mStringList;
this.mStringFilterList=mStringList;
mInflater=LayoutInflater.from(context);
getFilter();
}
//How many items are in the data set represented by this Adapter.
@Override
public int getCount() {
return mStringList.size();
}
//Get the data item associated with the specified position in the data set.
@Override
public Object getItem(int position) {
return mStringList.get(position);
}
//Get the row id associated with the specified position in the list.
@Override
public long getItemId(int position) {
return position;
}
//Get a View that displays the data at the specified position in the data set.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder viewHolder;
if(convertView==null) {
viewHolder=new Holder();
convertView=mInflater.inflate(R.layout.list_item,null);
viewHolder.nameTv=(TextView)convertView.findViewById(R.id.txt_listitem);
convertView.setTag(viewHolder);
}else{
viewHolder=(Holder)convertView.getTag();
}
viewHolder.nameTv.setText(mStringList.get(position).toString());
return convertView;
}
private class Holder{
TextView nameTv;
}
//Returns a filter that can be used to constrain data with a filtering pattern.
@Override
public Filter getFilter() {
if(valueFilter==null) {
valueFilter=new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
//Invoked in a worker thread to filter the data according to the constraint.
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results=new FilterResults();
if(constraint!=null && constraint.length()>0){
ArrayList<String> filterList=new ArrayList<String>();
for(int i=0;i<mStringFilterList.size();i++){
if(mStringFilterList.get(i).contains(constraint)) {
filterList.add(mStringFilterList.get(i));
}
}
results.count=filterList.size();
results.values=filterList;
}else{
results.count=mStringFilterList.size();
results.values=mStringFilterList;
}
return results;
}
//Invoked in the UI thread to publish the filtering results in the user interface.
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mStringList=(ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
}
activity_search_and_filter_list.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/txt_search"
tools:context=".SearchAndFilterList"
android:hint="Enter text to search" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list_view"
android:layout_below="@+id/txt_search"></ListView>
</RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txt_listitem"/>
</RelativeLayout>
AndroidManifext.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.searchandfilterlistview"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".SearchAndFilterList"
android:label="@string/title_activity_search_and_filter_list" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Ich hoffe, dass dieser Code wird hilfreich Gewohnheit implementieren Such- und Filterlistenansicht
Der beste Weg ist durch die integrierte Suchleiste oder Searchmanager zu verwenden, überschreiben in einer durchsuchbaren Aktivität onSearchRequested. Sie können eine Datenquelle festgelegt auf der Suche den automatischen Drop-Down der Ergebnisse zu erhalten, oder Sie können in der Eingabe vom Benutzer nur nehmen und suchen nach. Hier ist ein guter Überblick über Search a Außerdem gibt es eine funktionierende Demo in dem API-Demos Projekt com.example.android.apis.app.SearchQueryResult
@Override
public boolean onSearchRequested() {