简体   繁体   English

带有searchView的Android ActionBar

[英]Android ActionBar with searchView

How to add search functionality in action bar which can be a search specific listview from any activity of the app? 如何在操作栏中添加搜索功能,该功能可以是应用程序任何活动的搜索特定列表视图?

I am unable to find any proper example. 我找不到合适的例子。 The list view data comes from server, and was implemented with the help of this link . 列表视图数据来自服务器,并通过此链接实现

first of all you need to implement Filterable to your Adapter. 首先,您需要为您的适配器实现Filterable Then add search field to your actionbar menu. 然后将搜索字段添加到操作栏菜单。

<item android:id="@+id/menu_search" android:icon="@android:drawable/ic_menu_search" app:showAsAction="always" app:actionViewClass="android.support.v7.widget.SearchView" android:title="Search"/>

after this do the following in your activity. 之后,在您的活动中执行以下操作。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
        if (searchMenuItem == null) {
            return;
        }

        searchView = (SearchView) searchMenuItem.getActionView();
        if (searchView != null) {
            searchView.setQueryHint(getString(R.string.search_hint));
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    SearchFragment.this.onQueryTextChange(s);
                    return false;
                }
            });
        }
    }

and then 接着

void onQueryTextChange(String query) { searchAdapter.getFilter().filter(query); }

To implement a basic searchView using toolbar in android, roughly, you need to make the following modifications to the customListVolley project: 要大致使用android中的工具栏实现基本的searchView,您需要对customListVolley项目进行以下修改:

1. Add a toolbar to your activity_main.xml 1. 将工具栏添加到您的activity_main.xml
For example : 例如 :

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <android.support.v7.widget.Toolbar
        android:visibility="visible"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#1111DD"
        app:theme="@style/ToolbarTheme"/>

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="@color/list_divider"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/list_row_selector" />

</LinearLayout>


2. Create search_toolbar.xml & add it under menu folder 2. 创建search_toolbar.xml并将其添加到菜单文件夹下
Like this: 像这样:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" >

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"
        /> 

</menu>


3. Make your CustomListAdapter.java implement Filterable 3. 使您的CustomListAdapter.java实现可过滤
For example: 例如:

public class CustomListAdapter
        extends BaseAdapter
    implements Filterable
{
    private Activity activity;
    private LayoutInflater inflater;
    private List<Movie> movieItems;
    private List<Movie> originalList; //<--

    //-->
    private ItemFilter mFilter = new ItemFilter();

    @Override
    public Filter getFilter() {
        return mFilter;
    }
    //<--

    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public CustomListAdapter(Activity activity, List<Movie> movieItems) {
        this.activity = activity;
        this.movieItems = movieItems;
        originalList = movieItems; //<--
    }

    .
    .
    .

    //-->Implement your filter logic
    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString().toLowerCase();

            FilterResults results = new FilterResults();

            List<Movie> movies = new ArrayList<>();

            for(Movie item : originalList)
            {
                if(item.getTitle().toLowerCase().contains(filterString))
                    movies.add(item);
            }

            movieItems = movies;
            results.count = movies.size();
            return null;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            notifyDataSetChanged();
        }
    }//<--
}

4. Initialize the toolbar & the searchView in you main activity 4. 在您的主要活动中初始化工具栏和searchView
Like this: 像这样:

public class MainActivity extends AppCompatActivity {
    // Log tag
    private static final String TAG = MainActivity.class.getSimpleName();

    // Movies json url
    private static final String url = "http://api.androidhive.info/json/movies.json";
    private ProgressDialog pDialog;
    private List<Movie> movieList = new ArrayList<Movie>();
    private ListView listView;
    private CustomListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //-->Setup your toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        .
        . 
        .
    }

    .
    .
    .


    //--->Setup your searchView
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.search_toolbar, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);

        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
        {
            @Override
            public boolean onQueryTextChange(String newText)
            {
                // this is your adapter that will be filtered
                adapter.getFilter().filter(newText);
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query)
            {
                // this is your adapter that will be filtered
                adapter.getFilter().filter(query);
                return true;
            }
        };
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        SearchView searchView = null;
        if (searchItem != null) {
            searchView = (SearchView) searchItem.getActionView();
        }
        if (searchView != null) {
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
            searchView.setIconifiedByDefault(false);
            searchView.setOnQueryTextListener(textChangeListener);
        }

        return super.onCreateOptionsMenu(menu);
//        return true;
    }
}

This should allow you to implement a basic searchView. 这应该允许您实现基本的searchView。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM