2012-04-27 7 views
5

Tworzę aplikację typu eBook dla Androida i chcę odfiltrować tytuł książki, ale za każdym razem, gdy umieścisz słowo lub zdanie w edittext, przeszuka zawartość książek ... Czy ktoś może mi pomóc z tym ...Jak filtrować listę przez EditText

+0

zobaczyć ten post http://stackoverflow.com/questions/1645209/ how-can-i-filter-listview-data-when-pisząc-na-edittext-in-android –

+0

Utknąłem na tym przez jakiś czas, i znalazłem niektóre z odpowiedzi jawnie skomplikowane, więc ostatecznie wysłałem uproszczoną odpowiedź tutaj: http://stackoverflow.com/questions/ 17720481/how-could-i-filter-the-listview-using-baseadapter/36032382 # 36032382 –

Odpowiedz

0

Musisz napisać textChangedlistener (lub) TextWatcher dla edittext. Wewnątrz słuchacza musisz napisać logikę wyszukiwania. Oto APIdoc. Oto przykład na textwatcher.

+0

Widziałem już cały ten temat, ale nie ten, którego szukałem .. jeśli wiesz, możesz wysłać mi działający program więc widzę, czy jest to możliwe .. dzięki – Mordiggian

14

próbować ten jeden, kiedy u wpisać tekst w EditText lista pokaże przefiltrowaną wynik jak wykazały rzeczy w obrazach

początkowa:

Initial

filtrowane :

Filtered:
to 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> 

to 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

To jest świetne! Ale chcę to zrobić nieco inaczej. Mam adapter dla listy 10 najlepszych cly (jest to lista statyczna). Teraz, gdy użytkownik wpisze w polu edittext, chcę filtr z innej listy miast, które mam. Jak mogę to osiągnąć? – Namratha

+0

ok. Czy wiesz, gdzie chcesz wyświetlić filtrowany wynik po filtrowaniu z innej listy miast? –

4

mam pracy przykład, spróbuj tego:

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

Adapter musi implements Filterable

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

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

I klasa filtra:

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

     } 

Można sprawdzić ten post o więcej informacji:

Filter expandableList

Filter ListView