Подтвердить что ты не робот

Андроид - список поиска?

Возможно, у 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    

Любая идея, что мне не хватает?

4b9b3361

Ответ 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);

        }
    });

}

}

Ответ 3

Как еще один подход, сам ListView может отображать текст, который пользователь вводит (в отличие от использования отдельного TextView), обрабатывая события onKeyUp, прокручивая ListView до элемента, который имеет введенный текст, и подчеркивая, что текст в ListView. Я использую AsyncTask для реализации текстового поиска ListView, что приводит к удобной функции ввода вперед.