最初のアプリで作業しているときに、ユーザーがListView(UIスレッドにある)のエントリを検索できるようにしたいと思います。そのために、SearchViewをアクションバーに追加しました。
listView1.setTextFilterEnabled(true);
AsyncTaskで、アダプタをlistViewに設定しました。
protected void onPostExecute(boolean result) {
ListAdapter listadapter= new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, nameList);
listview1.setAdapter(listadapter);
}
今SearchView:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setOnQueryTextListener(this);
return true;
[...]
}
また、これらの関数を追加しました。
public boolean onQueryTextChange(String newText) {
ListView listview1= (ListView) findViewById(R.id.mylist);
listview1.setFilterText(newText);
//mFilter.filter(newText);
return false;
}
public boolean onQueryTextSubmit(String query) {
ListView listview1= (ListView) findViewById(R.id.mylist);
listview1.setFilterText(query);
}
これでフィルタリングは正常に機能していますが、検索されたcharシーケンスを含むこのオーバーレイは、フィルタリングされたデータを非表示にしています->見栄えがよくありません。
私がどこでも読んでいるように、このオーバーレイをオフにする簡単な可能性はありません。そこで、コードを少し変更しました。
onPostExecute(blaaaaa) { [...]
//Filter mFilter= = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, nameList).getFilter();
および2つの機能:
//mFilter.filter(the_entered_text);
((ArrayAdapter<String>)listAdapter).getFilter().filter(query);
((ArrayAdapter<String>)listAdapter).notifyDataSetChanged();
私の質問は、listViewを更新するにはどうすればよいですか? その「listview1.notifyDataSetChanged()」は、私のListAdapterで使用できないため、私にはオプションではありません。
編集:回答postetのようにアダプタをキャストすると、機能するようになりますが、次のようにフィルタリングされます。入力されたtext = "ka"-> "ka"を含むエントリではなく、"ka"で始まるすべてのエントリが表示されます。