从networking资源searchbuild议到快速search框中

我在应用程序中构buildsearch,需要将我从服务器获得的build议作为JSON数组input到显示在快速search框下方的build议列表中。

有一个简单的方法,让快速search框阅读这些资源?

目前我正在尝试使用ContentProvider,但接口方法清楚地表明应该查询数据库以获取build议。 我想如果您正在search存储在应用程序内的数据,使用ContentProvider是正确的方法。 我不太确定,但如果你需要查询networking资源,这是正确的方法。

把我从networking上得到的build议保存到本地数据库是没有意义的,因为build议和命中率会随时变化。

任何人有这个问题? 或者可以指向一个类似问题的方向? 提到networkingbuild议,我在这里找不到问题。

Solutions Collecting From Web of "从networking资源searchbuild议到快速search框中"

在developer.android.com上find解决scheme:

如果您有从networking位置获得的build议,则可以在从服务器获取结果时即时创build光标。

这在你的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; 

在快速search框中使用光标来填充build议列表。

这里是一个SearchView的例子,来自networking服务的build议(我使用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; } 

不知道人们是否仍然需要这个。 以防万一,为了将来的search者。 我的SearchView的build议有问题,但没有显示出来。 经过search,我find了一个解决scheme。 我使用了Volley作为我的内容提供者类(从web api获得build议),这似乎并不适合Android的内容提供者框架。 我还发现我的内容提供商DOES在UI线程中运行。 因此,如果我同时使用了Volley的Future,它会减慢(阻塞)UI直到请求返回(超时)。 另外,我发现networking上的信息显示,Volley的Future请求应该在其他线程中运行,比如在一个Async任务中,以使其运行良好。 因此,它并没有解决我的问题,因为如果我不得不使用它(在asynchronous任务中),我会首先使用Volley的正常(asynchronous)请求(这是我之前使用的)。 我做的是这样的:

  1. 在我的ContentProvider子类中,我定义了一个监听器接口:

    公共接口ResultListener {

      void onProviderResult(Cursor mCursor); void onProviderError(String errorMsg); 

    }

  2. 在我的activity(实现LoaderCallbacks)中,我也在接口上面实现了。

  3. 在我的单例应用程序类中,我定义了一个用作瞬态数据的静态variables,以及它的getter / setter方法:

    private static HashMap transientData = new HashMap();

    public static Object getTransientData(String objectName){

     return transientData.get(objectName); 

    }

    public static void setTransientData(String objectName,Object object){

     transientData.put(objectName, object); 

    }

  4. 现在的逻辑:在调用getSupportLoaderManager()。initLoader(…)之前 ,我调用MyApplication.setTransientData(“requestor”,this)

在我的内容提供者的类中,在抽象请求的onResponsecallback中,我这样做了:

public void onResponse(JSONArray response){

  ... ResultListener requestor = (ResultListener)TheApplication.getTransientData("requestor"); if (requestor!=null) requestor.onProviderResult(mCursor); 

}

所以当返回的抽象请求时,它会触发请求者的callback方法,并将响应中的数据填充到游标中,然后请求者(活动)通过调用adapter.swapCursor(c);来通知游标适配器。 adapter.notifyDataSetChanged();

希望这有助于某人。 祝福。