open source dictionary projectを変更しようとしています。ActionBarSherlock
SearchView$SearchAutoComplete
を使用しています。たとえば、「Google Play」というエントリがあります。 SearchView
は「Google」と入力したときに候補を返すことができますが、「再生」を検索した場合はそうではありません。 SearchView
がテキストを含むエントリを検索できるようにするにはどうすればよいですか?SearchView AutoCompleteTextViewで特定の文字を含むテキストを検索
public boolean onQueryTextChange(String newText) {
if (MdxDictBase.isMdxCmd(newText)){
currentEntry.setEntryNo(DictEntry.kSystemCmdEntryNo);
}
if (!skipUpdateEntryList) {
dict.locateFirst(newText, true, true, true, false, currentEntry);
syncHeadwordList();
}
skipUpdateEntryList = false;
return true; //return false if want the system provide a suggestion list?
}
完全コードはfound hereです。
そして、これはCursor
です。これはI found from hereです。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.d(TAG, "Got query:" + uri.toString());
if (uri.getPath() != null && uri.getPath().startsWith(SEARCH_PATH)) {
if (fCurrentDict != null && fCurrentDict.isValid()) {
String query=uri.getLastPathSegment();
if (query!=null && query.length()>0){
DictEntry entry = new DictEntry(0, "", fCurrentDict.getDictPref().getDictId());
if (query != null && query.length() > 0)
fCurrentDict.locateFirst(query, true, false, true, false, entry);
if (entry.isValid()) {
String limit = uri.getQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT);
int maxResultCount = 20;
if (limit != null && limit.length() > 0) {
try {
maxResultCount = Integer.parseInt(limit);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
ArrayList<DictEntry> entryList = new ArrayList<DictEntry>();
fCurrentDict.getEntries(entry, maxResultCount, entryList);
String[] columns = new String[]{
BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID,
SearchManager.SUGGEST_COLUMN_SHORTCUT_ID};
MatrixCursor cursor = new MatrixCursor(columns, maxResultCount);
Object[] row;
for (DictEntry cur_entry : entryList) {
String intentDataId = String.format("%d_%d_%s", cur_entry.getDictId(), cur_entry.getEntryNo(), cur_entry.getHeadword());
row = new Object[]{cur_entry.hashCode(), cur_entry.getHeadword(), intentDataId, SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT};
cursor.addRow(row);
}
return cursor;
}
}
}
}
return null;
}
これはlocateFirst
方法I found from hereです。
/**
* Locates the first entry that match the specified headword
*
* @param headword Headword to be searched for
* @param convertKey Convert the given headword into different Chinese form according to dictionary settings?
* @param partialMatch Match partial of the headword. For example "abc" can be matched with "abd" headword search
* @param entry The matched entry if found
* @return Return kMdxSuccess when succeed, otherwise return error codes.
*/
public synchronized int locateFirst(String headword, boolean convertKey, boolean partialMatch, boolean startWithMatch, boolean bestMatch, DictEntry entry) {
if (isValid()) {
return locateFirstN(headword, convertKey, partialMatch, startWithMatch, bestMatch, entry);
} else {
return kMdxDatabaseNotInited;
}
}
これは私が提案のリストを表示する責任があると考えているアダプタです:文字列の.Containsメソッドを使用TextChangedイベントに https://bitbucket.org/raymanzhang/mdict-android-opensource/src/eba7b9b4ead17a5b3e027da4a37dbd4ee1162596/src/cn/mdict/widgets/MdxAdapter.java?at=master&fileviewer=file-view-default
投稿したコードにフィルタリングの兆候は見られません。 'searchView'の入力文字列に基づいてフィルタリングを行うクラスやコードが必要です。 'searchView'から文字列を取得し、それを' onTextChanged'コールバックの中で検索クエリとして渡すコードを探し、それに関連するコードとそれに関連するコードを投稿してください。 – ahasbini
あなたの検索コードを追加してください。十分なコードではありません。 – ADM
私は自分の質問を編集しました。 – user2872856