Eri*_*vik 16 networking android json quick-search
我正在应用程序中构建搜索,并且需要有一种方法可以将我从服务器获得的建议作为JSON数组放入快速搜索框下方显示的建议列表中.
有一种简单的方法可以让快速搜索框读取这些资源吗?
目前我正在尝试使用ContentProvider,但是接口方法清楚地表明应该查询数据库以获取建议.我想如果您正在搜索存储在应用程序中的数据,那么使用ContentProvider是正确的方法.但是,我不太确定,如果您需要查询网络资源,这是正确的方法.
我将从网络获得的建议保存到本地数据库是没有意义的,因为建议及其命中率会不时变化.
有谁有这个问题?或者可以指出我在类似问题的方向?我在堆栈上找不到提到网络建议的问题.
Eri*_*vik 11
在developer.android.com上找到了解决方案:
如果您从网络位置获得建议,则可以在从服务器获取结果时动态构建游标.
这包含在ContentProvider的query()方法中:
String[] columns = {
BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_INTENT_DATA
};
MatrixCursor cursor = new MatrixCursor(columns);
for (int i = 0; i < arr.length(); i++)
{
String[] tmp = {Integer.toString(i), arr.getString(i), arr.getString(i)};
cursor.addRow(tmp);
}
return cursor;
Run Code Online (Sandbox Code Playgroud)
光标在快速搜索框中用于填充建议列表.
moo*_*oid 11
以下是SearchView的示例,其中包含来自网络服务的建议(我使用了Retrofit):
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_search_activity, menu);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));
final CursorAdapter suggestionAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
null,
new String[]{SearchManager.SUGGEST_COLUMN_TEXT_1},
new int[]{android.R.id.text1},
0);
final List<String> suggestions = new ArrayList<>();
searchView.setSuggestionsAdapter(suggestionAdapter);
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionSelect(int position) {
return false;
}
@Override
public boolean onSuggestionClick(int position) {
searchView.setQuery(suggestions.get(position), false);
searchView.clearFocus();
doSearch(suggestions.get(position));
return true;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
MyApp.autocompleteService.search(newText, new Callback<Autocomplete>() {
@Override
public void success(Autocomplete autocomplete, Response response) {
suggestions.clear();
suggestions.addAll(autocomplete.suggestions);
String[] columns = {
BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_INTENT_DATA
};
MatrixCursor cursor = new MatrixCursor(columns);
for (int i = 0; i < autocomplete.suggestions.size(); i++) {
String[] tmp = {Integer.toString(i), autocomplete.suggestions.get(i), autocomplete.suggestions.get(i)};
cursor.addRow(tmp);
}
suggestionAdapter.swapCursor(cursor);
}
@Override
public void failure(RetrofitError error) {
Toast.makeText(SearchFoodActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
Log.w("autocompleteService", error.getMessage());
}
});
return false;
}
});
return true;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5421 次 |
最近记录: |