Android 如何在Listview中添加搜索功能?

Android 如何在Listview中添加搜索功能?,android,listview,searchbar,Android,Listview,Searchbar,我的搜索栏有点问题。 我有一个应用程序在某些活动中有一个Listview,Listview中只有字符串。我想在此活动中添加搜索功能。 在过去的几天里,我在网上搜索了一些关于如何创建搜索栏的例子,我找到了很多关于如何创建搜索栏的指南和解释,它们都不能正确地在我的应用程序中工作,而且在大多数应用程序中,它们都没有解释在那里发生的事情背后的逻辑 是否有任何简单的指南/教程可以解释如何创建搜索栏(不管它是在操作栏上还是在布局中),从而将已经存在的字符串列表视图缩小为较小的列表?(例如,如果键入字母“a”

我的搜索栏有点问题。 我有一个应用程序在某些活动中有一个Listview,Listview中只有字符串。我想在此活动中添加搜索功能。 在过去的几天里,我在网上搜索了一些关于如何创建搜索栏的例子,我找到了很多关于如何创建搜索栏的指南和解释,它们都不能正确地在我的应用程序中工作,而且在大多数应用程序中,它们都没有解释在那里发生的事情背后的逻辑

是否有任何简单的指南/教程可以解释如何创建搜索栏(不管它是在操作栏上还是在布局中),从而将已经存在的字符串列表视图缩小为较小的列表?(例如,如果键入字母“a”,则会显示listview中包含字母“a”的所有字符串)


提前谢谢

以下代码将帮助您筛选listView的内容

  • 使用如下布局创建SearcView:

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

    现在,在适配器中创建扩展筛选器的内部私有类:

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

    我从哪里可以得到您创建的SearchFilter?mSearchFilter是哪个对象的参考?Anjali,非常感谢您的帮助,这段代码帮助了我,在我尝试通过web找到了这么多解决方案之后,thx!!
    //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();
        }
    }
    
    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) {
    
                }
            });