Android操作栏使用listview搜索

Jah*_*Jah 5 search android listview

我是android开发新手.我想要的是使用动作栏搜索视图小部件搜索我的列表视图.我该如何实现搜索功能.我缺少的是搜索功能.我看过一些搜索功能,但它基于editText.请帮忙.

这是我的代码:

menu.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" />
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

在我的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;
        }
Run Code Online (Sandbox Code Playgroud)

Kon*_*nov 3

您需要在适配器中实现Filterable接口。

然后膨胀菜单:

  @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); // /sf/ask/1264417241/
        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;
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

然后指定处理查询文本更改事件的方法,例如:

void onQueryTextChange(String query) {
    searchAdapter.getFilter().filter(query);
}
Run Code Online (Sandbox Code Playgroud)

在这里找到更多信息