Андроид - список поиска?
Возможно, у Android есть панель поиска для ListView, так что когда панель поиска коснется клавиатуры, и когда текст вводится в строку поиска, отображаются элементы, которые соответствуют в ListView?
Мне действительно нужна панель поиска, которая вызывает клавиатуру.
Update:
Я добавил поле EditText, которое вызывает клавиатуру, и я могу ввести в поле EditText. Я хочу, чтобы первые несколько символов элементов в списке, показанных в ListView, соответствовали символам, введенным в окно EditText.
Я пробовал следовать приведенному здесь подходу ListView Filter, но я немного запутался относительно того, сколько фильтрации уже сделано в ListView?
1) Нужно ли создавать отдельный массив, в котором хранятся значения, соответствующие тексту, введенному в EditText? Из этого сообщения Call adapter.notifyDataSetChanged, похоже, что ListView уже имеет теневой массив для этого, и он обновляется, когда adapter.notifyDataSetChanged(); называется.
2) Мне нужно вызвать adapter.notifyDataSetChanged(); обновить ListView после ввода некоторого текста в окне EditText?
3) Нужно ли расширять ListActivity, как это указано в сообщении ? Если да, то каким образом я могу расширить свой класс активности, если класс активности уже расширяется из основного действия?
4) В настоящее время у меня есть следующее:
ArrayAdapter<String> adapter = null;
private EditText filterText = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.symptom);
ListView symptomList = (ListView) findViewById(R.id.ListView_Symptom);
symptomList.setTextFilterEnabled(true);
symptomList.setFastScrollEnabled(true);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
adapter = new ArrayAdapter<String>(this, R.layout.menu_item, symptomsArray);
symptomList.setAdapter(adapter);
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
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);
adapter.notifyDataSetChanged();
}
};
К сожалению, в тот момент, когда я печатаю в поле EditText, я получаю исключение NullPointer в
Thread [<7> Filter] (Suspended (exception NullPointerException))
ArrayAdapter$ArrayFilter.performFiltering(CharSequence) line: 437
Filter$RequestHandler.handleMessage(Message) line: 234
Filter$RequestHandler(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
HandlerThread.run() line: 60
Любая идея, что мне не хватает?
Ответы
Ответ 1
Вы совершили очень маленькую ошибку: - создайте адаптер массива перед установкой изменения текста. Слушатель редактирует текст.
см. исправленный код
public class SearchListView extends Activity
{
/** Called when the activity is first created. */
private ListView lv1;
private String lv_arr[] =
{ "Android", "iPhone", "BlackBerry", "me", "J2ME", "Listview", "ArrayAdapter", "ListItem", "Us", "UK", "India" };
ListView lst;
EditText edt;
ArrayAdapter<String> arrad;
@Override
public void onCreate( Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv1=(ListView)findViewById(R.id.ListView01);
edt = (EditText) findViewById(R.id.EditText01);
arrad = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr);
lv1.setAdapter(arrad);
// By using setTextFilterEnabled method in listview we can filter the listview items.
lv1.setTextFilterEnabled(true);
edt.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
// TODO Auto-generated method stub
}
@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
SearchListView.this.arrad.getFilter().filter(arg0);
}
});
}
}
Ответ 2
Если вы внедрили Filterable в свой адаптер, ListView может обрабатывать фильтрацию.
Ответ 3
Как еще один подход, сам ListView может отображать текст, который пользователь вводит (в отличие от использования отдельного TextView), обрабатывая события onKeyUp, прокручивая ListView до элемента, который имеет введенный текст, и подчеркивая, что текст в ListView. Я использую AsyncTask для реализации текстового поиска ListView, что приводит к удобной функции ввода вперед.
Ответ 4
На этой странице вы можете найти что-то, что, вероятно, поможет вам
http://thinkandroid.wordpress.com/2010/01/11/custom-cursoradapters/