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
Odpowiedz
Musisz napisać textChangedlistener (lub) TextWatcher dla edittext. Wewnątrz słuchacza musisz napisać logikę wyszukiwania. Oto APIdoc. Oto przykład na textwatcher.
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
próbować ten jeden, kiedy u wpisać tekst w EditText lista pokaże przefiltrowaną wynik jak wykazały rzeczy w obrazach
początkowa:
filtrowane :
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
}
});
}
}
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
ok. Czy wiesz, gdzie chcesz wyświetlić filtrowany wynik po filtrowaniu z innej listy miast? –
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:
zobaczyć ten post http://stackoverflow.com/questions/1645209/ how-can-i-filter-listview-data-when-pisząc-na-edittext-in-android –
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 –