Liste de recherche Android tout en tapant

Comment puis-je créer une barre de recherche où pendant que je tape les résultats sont affichés dans le ListView dans lequel je recherche?

Par exemple, j'ai une vue de liste avec 20 chaînes. J'appuie sur la touche de recherche et apparaît la barre. Je veux que lorsque je tape 3 mots ou plus, la recherche commence à s'exécuter en affichant les résultats dans la vue liste (en tant que filtre: affiche uniquement les chaînes de la liste correspondant à ce que je tape)

21
demandé sur N J 2010-03-03 22:07:25

5 réponses

Vous ne pouvez pas le faire avec la barre de recherche. Mais le listview a la possibilité de filtrer sur la touche enfoncée , comme cela se fait dans les contacts. L'utilisateur commence simplement à taper et la liste est filtrée ensuite. Le filtrage n'est pas vraiment comme la recherche. Si votre liste contient le mot foo quelque part et que vous tapez oo foo sera filtré, mais si vous tapez fo il restera même si l'élément de liste est la barre d'appel foo.

Vous devez simplement l'activer:

ListView lv = getListView();
lv.setTextFilterEnabled(true);

Je ne sais pas comment c'est fait si vous n'avez pas de clavier matériel. J'utilise le droid et commencer à taper commence la liste à filtrer et à afficher uniquement les résultats correspondants.

13
répondu Janusz 2010-03-04 09:27:20

Je crois que c'est ce que vous cherchez:

Http://www.java2s.com/Code/Android/2D-Graphics/ShowsalistthatcanbefilteredinplacewithaSearchViewinnoniconifiedmode.htm

Demandez à votre activité d'implémenter SearchView.OnQueryTextListener

Et ajouter les méthodes suivantes:

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;
}
20
répondu edst 2012-11-11 18:30:35

, j'ai utilisé un EditText pour faire le travail.

J'ai d'abord créé deux copies du tableau pour contenir la liste des données à rechercher:

List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;

Une fois que j'ai les données de ma liste de quelque part, je les Copie:

for(Map<String,String>map : vehicleinfo)
{
    vehicleinfodisplay.add(map);
}

Et utilisez un SimpleAdapter pour afficher la version d'affichage (copiée) de mes données:

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);

Ensuite, j'ai ajouté un TextWatcher au EditText qui répond à un événement afterTextChanged en effaçant la version d'affichage de la liste, puis en ajoutant uniquement les éléments de l'autre liste qui répondent à la recherche critères (dans ce cas, le champ "reg" contient la chaîne de recherche). Une fois que la liste d'affichage est remplie avec la liste filtrée, j'appelle simplement notifyDataSetChanged sur SimpleAdapter de la 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 ...
});

J'espère que cela est utile à quelqu'un.

10
répondu Gareth 2012-04-11 14:21:24

Utilisez le code suivant pour implémenter la liste de recherche et de filtrage dans 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);
    }

}

Adaptateur de valeur personnalisée: 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>

J'espère que ce code sera utile pour implémenter la recherche personnalisée et filtrer listview

5
répondu Mahesh 2012-12-19 11:42:53

Le meilleur moyen est d'utiliser la barre de recherche intégrée ou SearchManager en remplaçant onSearchRequested dans une activité consultable. Vous pouvez définir une source de données à rechercher pour obtenir la liste déroulante automatique des résultats ou vous pouvez simplement prendre l'entrée de l'utilisateur et rechercher après. Voici un bon aperçu de SearchManager est un De plus, il y a une démo de travail dans le projet API Demos com.exemple.Android.API.App.SearchQueryResult

@Override
public boolean onSearchRequested() {
1
répondu Patrick Kafka 2010-03-03 23:23:51