2014-09-29 76 views
0

我在实现searchview时显示其服务器数据结果时遇到问题。我目前使用一个AsyncTask,所以我不会阻止用户界面。这里是我是如何实现它:SearchView AsyncTask UI未正确更新

searchView.setOnQueryTextListener(new OnQueryTextListener() { 

    @Override 
    public boolean onQueryTextChange(String query) { 

     if (query.length() > 0) { 
      new GetSearchByNameResultTask(searchView).execute(query); 
     } else { 
      return false; 
     } 

     return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

}); 

GetSearchByNameResultTask

class GetSearchByNameResultTask extends AsyncTask<String, Void, String> { 

    private SearchView searchView; 

    public GetSearchByNameResultTask(SearchView searchView) { 
     this.searchView = searchView; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     return WebRequestHelper.getInfo(params[0]); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     AppLog.d(TAG, "Result search: " + result); 
     Gson gson = new Gson(); 

     searchResponseList = gson.fromJson(result, new TypeToken<List<Info>>() { 
     }.getType()); 

     loadHistory(searchView, searchResponseList); 
     // TODO: search adapter 
    } 
} 

loadHistory()代码:

private void loadHistory(SearchView searchView, List<AppInfo> searchResponse) { 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     searchView.setSuggestionsAdapter(null); 
     // Cursor 
     String[] columns = new String[] { "_id", "text" }; 
     Object[] temp = new Object[] { 0, "default" }; 

     MatrixCursor cursor = new MatrixCursor(columns); 

     final List<Info> items = searchResponse; 

     for (int i = 0; i < items.size(); i++) { 

      temp[0] = i; 
      temp[1] = items.get(i).getName(); 
      cursor.addRow(temp); 
     } 
     CursorAdapter ca = new AppListSearchAdapter(this, cursor, items); 
     new AsyncQueryResult(cursor,ca).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); 
     // SearchView 
     searchView.refreshDrawableState(); 
     searchView.setSuggestionsAdapter(ca); 
     searchView.setOnSuggestionListener(new OnSuggestionListener() { 

      @Override 
      public boolean onSuggestionSelect(int position) { 
       // TODO Auto-generated method stub 
       return false; 
      } 

     }); 
    } 
} 

问题 一切运行正常的。我收到搜索结果。但我在更新视图时遇到问题。用一个例子也许最好的解释:

数据:在搜索

 
Hell 
Hello 
Helicopter 

文本:赫尔

结果:地狱

:在搜索

 
Hello World 
Hello 
Helicopter 

文本

 
Hell 
Hello 
[extra empty space] 

额外的空白空间是我的问题。 “列表视图”不会更新以适应结果,直到我输入'你好'

回答

0

我忘了回答这个问题。

我试图解决这个问题,虽然这对我来说有点破绽。这是我做的:

@Override 
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
    searchAdapter = new SearchAdapter(this, cursor, false); 

    mSearchView.setSuggestionsAdapter(searchAdapter); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      searchAdapter.notifyDataSetChanged(); 
     } 
    }, 200); 

    //Reload fragment to show list 
} 

这将强制刷新搜索视图的适配器。新的Handler()。postDelayed()是这里的关键。

希望这个解决方案有帮助。