2014-09-29 2 views
0

서버에서 오는 데이터에 대한 검색 결과를 보여주는 searchview 구현에 문제가 있습니다. 현재 AsyncTask를 사용하여 UI를 차단하지 않습니다. 여기에 내가 그것을 구현하는 방법은 다음과 같습니다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] 

여분의 빈 공간이 제 문제입니다. 'Hello'를 입력하기 전까지는 'listview'가 결과에 맞게 업데이트되지 않습니다.

답변

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()가 핵심 요소였습니다.

희망이 솔루션은 도움이됩니다.

관련 문제