2012-04-27 8 views
5

Im faire un eBook comme application pour android et je veux filtrer le titre du livre, mais chaque fois que vous mettez un mot ou une phrase dans le edittext il va chercher le contenu des livres ... Quelqu'un peut-il m'aider avec ce ...Comment filtrer ListView à travers EditText

+0

voir ce post http://stackoverflow.com/questions/1645209/ how-can-i-filter-listview-data-quand-taper-sur-edittext-en-android –

+0

J'ai été bloqué sur cela pendant un moment, et j'ai trouvé certaines des réponses compliquées, donc finalement posté une réponse simplifiée ici: http://stackoverflow.com/questions/ 17720481/how-could-je-filtre-the-listview-using-baseadapter/36032382 # 36032382 –

Répondre

0

Vous devez écrire textChangedlistener (ou) TextWatcher pour le edittext. Dans l'auditeur, vous devez écrire une logique de recherche. Voici APIdoc. Voici un exemple sur textwatcher.

+0

J'ai déjà vu tout ce sujet mais ce n'est pas celui que je cherche .. si vous le savez pouvez-vous s'il vous plaît envoyez-moi un programme en cours donc je peux voir si c'est posible à faire .. merci – Mordiggian

14

essayer celui-ci, chaque fois que u entrer du texte dans edittext, la liste affichera résultat filtré comme je l'ai montré les choses dans les images

initial:

Initial

Filtrée :

Filtered:
c'est main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<EditText 
    android:id="@+id/etSearchbox" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 
<ListView 
    android:id="@+id/lvFirst" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 

    ></ListView>  

</LinearLayout> 

c'est FilterListActivity.java

package com.filterlist; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 

public class FilterListActivity extends Activity{ 

EditText etSearchbox; 
ListView lvFirst; 
ArrayAdapter<String> adapter1; 
String[] data = {"mehul joisar","amit mishra","amitabh","Aamir khan","jesica","katrina"}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

etSearchbox=(EditText)findViewById(R.id.etSearchbox); 
lvFirst=(ListView)findViewById(R.id.lvFirst); 
lvFirst.setTextFilterEnabled(true); 

adapter1 = new ArrayAdapter<String>(FilterListActivity.this, android.R.layout.simple_list_item_1, data); 
lvFirst.setAdapter(adapter1); 

etSearchbox.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
     FilterListActivity.this.adapter1.getFilter().filter(arg0); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
      int arg3) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     // TODO Auto-generated method stub 

    } 
}); 




} 
} 
+0

C'est génial! Mais je veux le faire un peu différemment. J'ai un adaptateur pour une liste des 10 meilleurs cties (c'est une liste statique). Maintenant, lorsque l'utilisateur tape dans la boîte edittext, je veux le filtre de l'autre liste de villes que j'ai. Comment puis-je y parvenir? – Namratha

+0

ok.let me savoir où voulez-vous afficher le résultat filtré après filtrage de l'autre liste de villes? –

4

j'ai un exemple de travail, essayez ceci:

filterEditText = (EditText)findViewById(R.id.filter); 
filterEditText.addTextChangedListener(filterTextWatcher); 

TextWatcher filterTextWatcher = new TextWatcher() { 

     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 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub    
     } 
    }; 

L'adaptateur doit implements Filterable

  @Override 
      public Filter getFilter() { 
//    Filter filter = null; 

       if(filter == null) 
        filter = new CheeseFilter(); 
       return filter; 
      } 

Et la classe filtre:

 public class CheeseFilter extends Filter { 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       // TODO Auto-generated method stub 

       constraint = constraint.toString().toLowerCase(); 

       FilterResults newFilterResults = new FilterResults(); 

       if (constraint != null && constraint.length() > 0) { 


        ArrayList<String> auxData = new ArrayList<String>(); 

        for (int i = 0; i < data.size(); i++) { 
         if (data.get(i).toLowerCase().contains(constraint)) 
          auxData.add(data.get(i)); 
        } 

        newFilterResults.count = auxData.size(); 
        newFilterResults.values = auxData; 
       } else { 

        newFilterResults.count = data.size(); 
        newFilterResults.values = data; 
       } 

       return newFilterResults; 
      } 

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

       ArrayList<String> resultData = new ArrayList<String>(); 

       resultData = (ArrayList<String>) results.values; 

       EfficientAdapter adapter = new EfficientAdapter(context, resultData); 
       list.setAdapter(adapter); 

//    notifyDataSetChanged(); 
      } 

     } 

Vous pouvez consulter cet article pour plus d'informations:

Filter expandableList

Filter ListView

Questions connexes