Android actionbar 使用 ListView 搜索

标签 android listview search

我是 android 开发的新手。我想要的是使用操作栏搜索 View 小部件在我的 ListView 上进行搜索。我如何实现搜索功能。我缺少的是这个的搜索功能。我看到了一些搜索功能,但它是基于 editText 的。请帮忙。

这是我的代码:

菜单.xml

   <item android:id="@+id/menu_search"
          android:title="@string/menu_search"
          android:icon="@android:drawable/ic_menu_search"
          android:showAsAction="ifRoom|collapseActionView"
          android:actionViewClass="android.widget.SearchView" />

在我的 manifest.xml 中

<activity
            android:name=".MainActivity"
             <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable">
            </meta-data>
        </activity>

在我的 MainActivity.java 上

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

                this.lv = (ListView) findViewById(R.id.listView);

                this.databaseAccess = DatabaseAccess.getInstance(getApplicationContext());
                this.persons= getPersonList();

                Adapter adapter = new Adapter(this, persons);
                this.lv.setAdapter(adapter);
}
    public List<Person> getPersonList(){
            databaseAccess.open();
            List<Person> person= databaseAccess.getPersons();
            databaseAccess.close();
            return person;
        }

 private class Adapter extends ArrayAdapter<Person> {

        public Adapter(Context context, List<Person> objects) {
            super(context, 0, objects);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.persons, parent, false);
            }

            TextView id = (TextView) convertView.findViewById(R.id.id);
            TextView name= (TextView) convertView.findViewById(R.id.name);
            TextView lastname = (TextView) convertView.findViewById(R.id.latname);

            Person p = persons.get(position);
            id.setText(p.getId());
            name.setText(p.getName());
            lastname.setText(p.getLastName());

            return convertView;
        }

最佳答案

您需要实现 Filterable适配器中的接口(interface)。

然后展开菜单:

  @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.setMaxWidth(2129960); // https://stackoverflow.com/questions/18063103/searchview-in-optionsmenu-not-full-width
        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);
}

查找更多信息 here

关于Android actionbar 使用 ListView 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31943221/

相关文章:

android - 解码二进制文件

c# - 无法访问 ListView 中所选项目的字段

android - Google Search Like 小部件示例

perl - 如何在 IMAP 邮件主题中搜索非 ASCII 文本

android - 如何使用带有 react-native-drive-api-wrapper 的 react native 将图像上传到 google drive?

android - 在 android studio 中编译项目时重复条目 : com/android/volley/AuthFailureError. 类

android - 使用emptyView和ListView时的SwipeRefreshLayout问题

android - 我无法在 android 的 ListView 中显示数组列表

C++ 在 vector 中搜索元素首次出现的位置

Android 平板应用质量 - 尺寸定制