Frage

Wie kann ich eine Suchleiste bauen, wo während ich die Ergebnisse tippen bin in den ListView gezeigt, in der ich suche?

Zum Beispiel habe ich eine Listenansicht mit 20 Saiten. Ich drücke den Suchschlüssel und erscheinen an der Latte. Ich möchte, wenn ich 3 Wörter eingeben oder mehr die Suche zu laufen beginnt, die Ergebnisse in der Listenansicht zeigt (als Filter: zeigt nur die Strings in der Liste das passende was ich schreibe)

War es hilfreich?

Lösung

Sie können dies nicht mit der Suchleiste. Aber die Listview hat eine Möglichkeit, Filter auf Taste , wie es in den Kontakten erfolgt. Der Benutzer startet einfach mit der Eingabe und die Liste wird dann filtriert. Das Filtern ist nicht wirklich wie die Suche. Wenn Sie Liste enthält das Wort foo irgendwo und Sie oo foo Typ herausgefiltert werden, aber wenn Sie geben fo es auch bleiben, wenn das Listenelement Anruf bar foo ist.

Sie einfach es ermöglichen, haben:

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

Ich weiß nicht, wie dies geschehen ist, wenn Sie nicht über eine Hardware-Tastatur. Ich bin die Droiden mit und Typ Start beginnt die Liste zu filtern und zu zeigen, nur passende Ergebnisse.

Andere Tipps

Ich glaube, das ist das, was Sie suchen:

http://www.java2s.com/Code/Android/ 2D-Grafik / ShowsalistthatcanbefilteredinplacewithaSearchViewinnoniconifiedmode.htm

Haben Sie Ihre Aktivität SearchView.OnQueryTextListener implementieren

und fügen Sie die folgenden Methoden:

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

Ich habe eine EditText die Arbeit zu tun.

Zuerst habe ich erstellt zwei Kopien des Arrays die Liste der Daten zu halten suchen:

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

Wenn ich meine Liste Daten von irgendwo habe ich kopieren:

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

und eine SimpleAdapter verwenden, um die Anzeige (kopiert) Version meiner Daten angezeigt werden:

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

Dann hat ich eine TextWatcher zum EditText, die durch das Löschen der Anzeigeversion der Liste auf ein afterTextChanged Ereignis reagiert und dann das Hinzufügen wieder nur die Elemente aus der anderen Liste, dass erfüllt die Suchkriterien (in diesem Fall des „reg“ -Feld enthält die Suchzeichenfolge). Sobald die Anzeigeliste mit der gefilterten Liste aufgefüllt wird, nenne ich nur notifyDataSetChanged auf der SimpleAdapter 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 ...
});

Hope Dies ist hilfreich für jemanden.

Verwenden Sie folgenden Code Such- und Filterliste in Android implementieren:

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

}

Benutzerdefinierte Wert Adapter: 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>

Ich hoffe, dass dieser Code wird hilfreich Gewohnheit implementieren Such- und Filterlistenansicht

Der beste Weg ist durch die integrierte Suchleiste oder Searchmanager zu verwenden, überschreiben in einer durchsuchbaren Aktivität onSearchRequested. Sie können eine Datenquelle festgelegt auf der Suche den automatischen Drop-Down der Ergebnisse zu erhalten, oder Sie können in der Eingabe vom Benutzer nur nehmen und suchen nach. Hier ist ein guter Überblick über Search a Außerdem gibt es eine funktionierende Demo in dem API-Demos Projekt com.example.android.apis.app.SearchQueryResult

@Override
public boolean onSearchRequested() {
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top