Tout d'abord, vous devez créer une mise en page XML qui a à la fois un EditText et un ListView.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- Pretty hint text, and maxLines -->
<EditText android:id="@+building_list/search_box"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type to filter"
android:inputType="text"
android:maxLines="1"/>
<!-- Set height to 0, and let the weight param expand it -->
<!-- Note the use of the default ID! This lets us use a
ListActivity still! -->
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
Cela mettra tout en place correctement, avec un joli EditText au-dessus de ListView. Ensuite, créez un ListActivity comme vous le feriez normalement, mais ajoutez un setContentView()
appel à la onCreate()
méthode afin que nous utilisions notre disposition récemment déclarée. N'oubliez pas que nous avons identifié le ListView
spécialement, avec android:id="@android:id/list"
. Cela permet au ListActivity
de savoir ce que ListView
nous voulons utiliser dans notre mise en page déclarée.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
L'exécution de l'application maintenant devrait afficher votre précédente ListView
, avec une belle boîte au-dessus. Pour que cette boîte fasse quelque chose, nous devons en extraire l'entrée et faire en sorte que cette entrée filtre la liste. Bien que beaucoup de gens aient essayé de le faire manuellement, la plupart des ListView
Adapter
classes sont livrées avec un Filter
objet qui peut être utilisé pour effectuer le filtrage automatiquement. Nous avons juste besoin de canaliser l'entrée du EditText
vers le Filter
. Il s'avère que c'est assez facile. Pour exécuter un test rapide, ajoutez cette ligne à votre onCreate()
appel
adapter.getFilter().filter(s);
Notez que vous devrez enregistrer votre fichier ListAdapter
dans une variable pour que cela fonctionne - j'ai enregistré mon ArrayAdapter<String>
de plus tôt dans une variable appelée «adaptateur».
L'étape suivante consiste à obtenir l'entrée du EditText
. Cela demande un peu de réflexion. Vous pouvez ajouter un OnKeyListener()
à votre EditText
. Cependant, cet écouteur ne reçoit que certains événements clés . Par exemple, si un utilisateur entre «wyw», le texte prédictif recommandera probablement «eye». Tant que l'utilisateur ne choisit pas «wyw» ou «eye», vous OnKeyListener
ne recevrez pas d'événement clé. Certains préfèrent peut-être cette solution, mais je l'ai trouvée frustrante. Je voulais chaque événement clé, donc j'avais le choix entre filtrer ou non filtrer. La solution est un TextWatcher
. Créez simplement et ajoutez un TextWatcher
à EditText
, et transmettez la ListAdapter
Filter
demande de filtre à chaque fois que le texte change. N'oubliez pas de supprimer le TextWatcher
in OnDestroy()
! Voici la solution finale:
private EditText filterText = null;
ArrayAdapter<String> adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}