elenco di ricerca durante la digitazione Android
-
24-09-2019 - |
Domanda
Come posso costruire una barra di ricerca dove, mentre sto scrivendo I risultati sono mostrati nella ListView
in cui sto cercando?
Per esempio, ho una vista elenco con 20 corde. Premo il tasto di ricerca e appare la barra. Voglio quando si digita 3 parole o più inizia la ricerca in esecuzione che mostra i risultati in vista elenco (come un filtro: mostra solo le stringhe nella lista che corrispondente quello che tipo)
Soluzione
Non si può fare questo con la barra di ricerca. Ma ListView ha la possibilità di filtro sul tasto premuto , come si è fatto in contatti. L'utente inizia a digitare semplicemente e l'elenco viene filtrato poi. Filtraggio non è davvero come la ricerca. Se l'elenco contiene qualche parola foo e si digita oo foo verrà filtrato, ma se si digita fo che rimarrà anche se l'elemento della lista è il bar chiamata foo.
È sufficiente per consentirgli:
ListView lv = getListView();
lv.setTextFilterEnabled(true);
Non so come si fa, se non si dispone di una tastiera hardware. Sto usando il droide e di partenza per il tipo inizia l'elenco per filtro e per mostrare i risultati solo corrispondenti.
Altri suggerimenti
Credo che questo è quello che stai cercando:
Avere il vostro Attività implementare SearchView.OnQueryTextListener
e aggiungere i seguenti metodi:
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;
}
ho usato un EditText
per fare il lavoro.
Per prima cosa ho creato due copie della matrice per contenere l'elenco dei dati per la ricerca:
List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;
Una volta che ho i miei dati di elenco da qualche parte, lo copio:
for(Map<String,String>map : vehicleinfo)
{
vehicleinfodisplay.add(map);
}
e utilizzare un SimpleAdapter
per visualizzare la versione con display (copiato) dei miei dati:
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);
Poi ho aggiunto un TextWatcher
al EditText
che risponde a un evento afterTextChanged
deselezionando la versione visualizzazione dell'elenco e quindi aggiungendo indietro solo gli elementi dal lato Lista che soddisfano i criteri di ricerca (in questo caso il campo "reg" contiene la stringa di ricerca). Una volta che l'elenco di visualizzazione è popolato con l'elenco filtrato, mi basta chiamare notifyDataSetChanged
sul SimpleAdapter
della lista.
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 ...
});
Spero che questo è utile a qualcuno.
Usa seguente codice per implementare la ricerca e elenco dei filtri in Android:
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);
}
}
Adattatore Valore personalizzato: 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>
spero che questo codice sarà utile per implementare Ricerca personalizzata e filtro listview
Il modo migliore è quello di utilizzare il costruito nel barra di ricerca o SearchManager sovrascrivendo onSearchRequested in un'attività ricercabile. È possibile impostare un DataSource per cercare di ottenere il giù goccia automatica dei risultati o si può semplicemente prendere in input da parte dell'utente e di ricerca dopo. Ecco una panoramica di buona SearchManager è un Inoltre v'è una demo di lavoro nel progetto di Demos API com.example.android.apis.app.SearchQueryResult
@Override
public boolean onSearchRequested() {