【问题标题】:Android ActionBar with searchView带有 searchView 的 Android ActionBar
【发布时间】:2016-05-31 06:23:45
【问题描述】:

如何在操作栏中添加搜索功能,该功能可以是来自应用程序任何活动的搜索特定列表视图?

我找不到任何合适的例子。列表视图数据来自服务器,在this link 的帮助下实现。

【问题讨论】:

标签: android listview android-actionbar android-volley searchview


【解决方案1】:

首先你需要为你的适配器实现Filterable。 然后将搜索字段添加到您的操作栏菜单。

<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"/>

之后,在您的活动中执行以下操作。

@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;
                }
            });
        }
    }

然后

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

【讨论】:

    【解决方案2】:

    要在android中实现一个基本的使用toolbar的searchView,大致需要对customListVolley项目进行如下修改:

    1. 将工具栏添加到您的 activity_main.xml
    例如:

    <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. 创建search_toolbar.xml并将其添加到菜单文件夹下
    像这样:

    <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. 让您的 CustomListAdapter.java 实现 Filterable
    例如:

    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. 在您的主活动中初始化工具栏和 searchView
    像这样:

    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;
        }
    }
    

    这应该允许您实现基本的 searchView。

    【讨论】:

    • 有什么问题?
    • 给ItemFilter类附加一个调试器,检查数据是否正确
    猜你喜欢
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2014-07-02
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2015-10-10
    相关资源
    最近更新 更多