Как добавить функцию поиска в Listview?

У меня проблема с панелью поиска. У меня есть приложение, в котором есть список в какой-то активности, внутри списка есть только строки. Я хотел добавить в это действие функцию поиска. В последние несколько дней я искал в Интернете несколько примеров того, как это сделать, и я нашел множество руководств и объяснений того, как создать панель поиска, и ни одно из них не работает в моем приложении правильно и в большинстве случаев. им нет объяснения логики того, что там происходит.

Есть ли какое-нибудь простое руководство/учебник, которое может объяснить, как создать панель поиска (неважно, будет ли она на панели действий или в макете), которая уменьшит уже существующий список строк в меньший список? (Например, если вы наберете букву «а», будут показаны все строки внутри списка, содержащие букву «а»).

Заранее спасибо!


person Fima Taf    schedule 20.11.2015    source источник


Ответы (1)


Следующий код поможет вам отфильтровать содержимое вашего listView.

  1. Создайте SearcView, используя такой макет:

        <ImageView
            android:id="@+id/icon_search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="8dp"
            android:src="@drawable/icon_search" />
    
        <EditText
            android:id="@+id/et_userInput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:background="@null"
            android:hint="@string/search_friends_and_contacts"
            android:singleLine="true"
            android:textColor="@color/white"
            android:textColorHint="@color/white"
            android:textSize="14sp" />
    
        <ImageView
            android:id="@+id/icon_close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="8dp"
            android:src="@drawable/icon_close_white" />
    

include this in your listview Layout.

  1. Обновите класс адаптера:

реализует ваш класс адаптера с помощью Filterable. И переопределите метод getFilter и внутри вашего метода getFilter напишите этот код:

private SearchFilter mSearchFilter ;

 @Override
    public Filter getFilter() {
        if (mSearchFilter == null) {
            mSearchFilter = new SearchFilter();
        }
        return mSearchFilter;
    }

теперь создайте внутренний частный класс в вашем адаптере, который расширяет фильтр:

частный класс SearchFilter расширяет фильтр {

//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<FriendsModel>();
        for (int i = 0; i < mOriginalList.size(); i++) {
            if ((mOriginalList.get(i).toUpperCase())
                    .contains(constraint.toString().toUpperCase())) {
                filterList.add(mOriginalList.get(i));
            }
        }
        results.count = filterList.size();
        results.values = filterList;
    } else {
        results.count = mOriginalList.size();
        results.values = mOriginalList;
    }
    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) {
    mListViewArrayList = (ArrayList<String>) results.values;
    notifyDataSetChanged();
    }
}

также определите два ArrayListVariable в вашем классе адаптера следующим образом:

ArrayList<String> mListViewArrayList ; <----- which will be used to render data from getView Method
ArrayList<String> mOriginalList ; <----- Which holds original list all the time.

И чтобы вызвать этот фильтр из действия, напишите следующий код в своем действии:

et_userInput.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                yourAdapter.getFilter().filter(arg0);
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                          int arg3) {
            }

            @Override
            public void afterTextChanged(Editable arg0) {

            }
        });
person Anjali    schedule 20.11.2015
comment
Где взять созданный вами SearchFilter? mSearchFilter является ссылкой на какой объект? - person Fima Taf; 20.11.2015
comment
Анджали, большое спасибо за помощь, этот код помог мне после стольких решений, которые я пытался найти в Интернете, спасибо !! - person Fima Taf; 24.11.2015