わかりました、私はこれに時間を費やしました。から独自の簡単な提案の実装を作成しSQLiteDatabase
ます。
次のような 3 つのクラスを作成します。
MainActivity
SearchView
-データベースからの提案のテスト用
SuggestionDatabase
- 最近の検索キーワードが保存されます。
SuggestionSimpleCursorAdapter
- これは のサブクラスですSimpleCursorAdapter
。を使用する代わりにこのクラスを作成する理由を説明しますSimpleCursorAdapter
。
コード
// MainActivity.java
public class MainActivity
extends Activity
implements SearchView.OnQueryTextListener,
SearchView.OnSuggestionListener
{
private SuggestionsDatabase database;
private SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
database = new SuggestionsDatabase(this);
searchView = (SearchView) findViewById(R.id.searchView1);
searchView.setOnQueryTextListener(this);
searchView.setOnSuggestionListener(this);
}
@Override
public boolean onSuggestionSelect(int position) {
return false;
}
@Override
public boolean onSuggestionClick(int position) {
SQLiteCursor cursor = (SQLiteCursor) searchView.getSuggestionsAdapter().getItem(position);
int indexColumnSuggestion = cursor.getColumnIndex( SuggestionsDatabase.FIELD_SUGGESTION);
searchView.setQuery(cursor.getString(indexColumnSuggestion), false);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
long result = database.insertSuggestion(query);
return result != -1;
}
@Override
public boolean onQueryTextChange(String newText) {
Cursor cursor = database.getSuggestions(newText);
if(cursor.getCount() != 0)
{
String[] columns = new String[] {SuggestionsDatabase.FIELD_SUGGESTION };
int[] columnTextId = new int[] { android.R.id.text1};
SuggestionSimpleCursorAdapter simple = new SuggestionSimpleCursorAdapter(getBaseContext(),
android.R.layout.simple_list_item_1, cursor,
columns , columnTextId
, 0);
searchView.setSuggestionsAdapter(simple);
return true;
}
else
{
return false;
}
}
}
使い方
- ユーザーが検索ボタンをタップすると、
onQueryTextSubmit()
がトリガーされ、検索キーワードがデータベースに保存されます。キーワード「Hello」を送信するとします。
- ユーザーが "Hel" や "H" などの文字列を に書き込むと、
SearchView
がonQueryTextChange()
呼び出され、このキーワードをSQLiteDatabase
( SuggestionDatabase
) で検索します。"Hel" または "H" が "Hello" に一致する場合は、返された Cursor を に設定してクエリの結果を表示しSuggestionSimpleCursorAdapter
、次にこのアダプターを に設定しSearchView
ます。これが写真です。

3. もちろん、「こんにちは」という提案をタップonSuggestionClick(int position)
します。そのために呼び出されます。のアダプタ ( )SQLiteCursor
からオブジェクトを取得し、そこから提案テキストを取得して、提案テキストをオブジェクトに設定します。SearchView
SuggestionSimpleCursorAdapter
SearchView
SQLiteCursor cursor = (SQLiteCursor) searchView.getSuggestionsAdapter().getItem(position);
int indexColumnSuggestion = cursor.getColumnIndex( SuggestionsDatabase.FIELD_SUGGESTION);
searchView.setQuery(cursor.getString(indexColumnSuggestion), false);
使用SimpleCursorAdapter
しても適切に機能しますが、このシナリオがあるとしましょう
- このプログラムをスマートフォンで実行し、キーワード「Hel」を入力すると、候補が適切に表示されます。

- 画面を横向きに回転させたらどうなりますか? 全画面モードに切り替わり、引き続きキーワードを入力できます。
提案ではどうなりますか?見てみましょう。

奇妙な提案を参照してください。どうやってそれを解決しますか?convertToString(Cursor cursor)
を返す which をオーバーライドすることによりCharSequence
// SuggestionSimpleCursorAdapter.java
public class SuggestionSimpleCursorAdapter
extends SimpleCursorAdapter
{
public SuggestionSimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
}
public SuggestionSimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
}
@Override
public CharSequence convertToString(Cursor cursor) {
int indexColumnSuggestion = cursor.getColumnIndex(SuggestionsDatabase.FIELD_SUGGESTION);
return cursor.getString(indexColumnSuggestion);
}
}
をオーバーライドconvertToString(Cursor cursor)
すると、結果は次のようになります

そしてデータベースはこちら
// SuggestionDatabase.java
public class SuggestionsDatabase {
public static final String DB_SUGGESTION = "SUGGESTION_DB";
public final static String TABLE_SUGGESTION = "SUGGESTION_TB";
public final static String FIELD_ID = "_id";
public final static String FIELD_SUGGESTION = "suggestion";
private SQLiteDatabase db;
private Helper helper;
public SuggestionsDatabase(Context context) {
helper = new Helper(context, DB_SUGGESTION, null, 1);
db = helper.getWritableDatabase();
}
public long insertSuggestion(String text)
{
ContentValues values = new ContentValues();
values.put(FIELD_SUGGESTION, text);
return db.insert(TABLE_SUGGESTION, null, values);
}
public Cursor getSuggestions(String text)
{
return db.query(TABLE_SUGGESTION, new String[] {FIELD_ID, FIELD_SUGGESTION},
FIELD_SUGGESTION+" LIKE '"+ text +"%'", null, null, null, null);
}
private class Helper extends SQLiteOpenHelper
{
public Helper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "+TABLE_SUGGESTION+" ("+
FIELD_ID+" integer primary key autoincrement, "+FIELD_SUGGESTION+" text);");
Log.d("SUGGESTION", "DB CREATED");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
この回答が他のプログラマーに役立つことを願っています。:)