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>
Ceci affichera tout correctement, avec un bon EditText au-dessus du ListView. Ensuite, créez une ListActivity comme vous le feriez normalement, mais ajoutez un appel setContentView()
dans la méthode onCreate()
afin que nous utilisions notre disposition récemment déclarée. Rappelez-vous que nous avons identifié le ListView
spécialement, avec android:id="@android:id/list"
. Cela permet au ListActivity
de savoir quel ListView
nous voulons utiliser dans notre disposition 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());
}
Exécution de l'application devrait maintenant montrer votre ListView
précédente, avec une jolie boîte ci-dessus. Pour que cette boîte fasse quelque chose, nous devons en prendre l'entrée et faire en sorte que cette entrée filtre la liste. Alors que beaucoup de gens ont essayé de le faire manuellement, la plupart des classesListView
Adapter
viennent avec un objet Filter
qui peut être utilisé pour effectuer le filtrage automagiquement. Nous avons juste besoin de canaliser l'entrée du EditText
dans 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 ListAdapter
à une variable pour faire ce travail - je l'ai sauvé ArrayAdapter<String>
de plus tôt dans une variable appelée « adaptateur '. L'étape suivante consiste à obtenir l'entrée de EditText
. Cela nécessite 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 «œil». Tant que l'utilisateur n'a pas choisi 'wyw' ou 'eye', votre OnKeyListener
ne recevra aucun événement clé. Certains peuvent préférer cette solution, mais j'ai trouvé cela frustrant. Je voulais tous les événements clés, j'ai donc eu le choix de filtrer ou de ne pas filtrer. La solution est un TextWatcher
. Il suffit de créer et d'ajouter un TextWatcher
au EditText
, et de passer le ListAdapter
Filter
à chaque fois que le texte change. N'oubliez pas d'enlever le TextWatcher
dans 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);
}
Je nomine pour la réouverture. J'ai mis à jour le texte pour en faire une question plus pertinente, et il s'agit clairement d'une ressource communautaire précieuse, car les réponses sont toujours en cours. – Hamy
Veuillez rouvrir la question. C'est clairement utile. – SilentNot