2012-07-04 14 views
8

Tôi có một tiện ích tìm kiếm (SearchView), hiển thị các đề xuất tùy chỉnh khi nhập. Tôi đã theo dõi official guide để thêm các truy vấn gần đây vào đề xuất nhưng tôi vẫn chỉ có các đề xuất tùy chỉnh.
Đối với mỗi lần tìm kiếm, đoạn tôi gọi hàm này (xác minh):tìm kiếm gần đây không được hiển thị, đề xuất tùy chỉnh là

private void addQueryToRecent(String query) { 
    SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(), 
      MyCustomSuggestionProvider.AUTHORITY, 
      MyCustomSuggestionProvider.MODE); 
    suggestions.saveRecentQuery(query, "recent"); 
} 

cung cấp Đề nghị của tôi có vẻ ok:

public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider { 

public final static String AUTHORITY = "com.zgui.musicshaker.provider.MyCustomSuggestionProvider"; 
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES; 

public MyCustomSuggestionProvider() { 
    setupSuggestions(AUTHORITY, MODE); 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String sel, 
     String[] selArgs, String sortOrder) { 
    //retrieves a custom suggestion cursor and returns it 
} 
} 

searchable.xml:

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:hint="artist, track informations..." 
android:label="@string/app_name" 
android:queryAfterZeroResults="true" 
android:searchSuggestAuthority="com.zgui.musicshaker.provider.MyCustomSuggestionProvider" 
android:searchSuggestSelection=" ?" /> 

manifest:

  <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
<provider 
     android:name=".provider.MyCustomSuggestionProvider" 
     android:authorities="com.zgui.musicshaker.provider.MyCustomSuggestionProvider" 
     android:enabled="true" > 
    </provider> 

Theo cách that post, tôi dự định có một db tìm kiếm gần đây tại dữ liệu/dữ liệu/app.package.name/cơ sở dữ liệu/databasename.db, nhưng tôi dường như không ...
Hoặc có thể tôi có nên thêm "gợi ý tìm kiếm gần đây" vào con trỏ mà MyCustomSuggestionProvider.query() trả về không? Bất cứ ý tưởng được chào đón ...

+0

Bạn không sử dụng SearchSuggestionProvider, làm cách nào? –

Trả lời

6

Tìm thấy nó: nó là không rõ ràng chút nào trên Tài liệu Android, nhưng tôi cần phải thực hiện các yêu cầu bản thân mình và hợp nhất các con trỏ trong MyCustomSuggestionProvider.query():

Cursor recentCursor = super.query(uri, projection, sel, selArgs, 
      sortOrder); 
Cursor[] cursors = new Cursor[] { recentCursor, customCursor}; 
return new MergeCursor(cursors); 

Hãy chắc chắn rằng bạn có các cột tương tự trong cả hai mặc dù ...

+3

Bạn đã tìm ra cách đối sánh các cột giống hệt nhau như thế nào? – KickingLettuce

+0

CustomCursor của bạn trông như thế nào? –

+1

Bạn có ý nghĩa gì bởi "đảm bảo bạn có cùng cột trong cả hai"? –

1
private static final String[] SEARCH_SUGGEST_COLUMNS = { 
     SearchManager.SUGGEST_COLUMN_FORMAT, 
     SearchManager.SUGGEST_COLUMN_ICON_1, 
     SearchManager.SUGGEST_COLUMN_TEXT_1, 
     SearchManager.SUGGEST_COLUMN_INTENT_DATA, 
     BaseColumns._ID }; 

trên đây là danh sách các cột được sử dụng trong gợi ý tìm kiếm db gần đây, sử dụng cùng một danh sách cho các đề xuất tìm kiếm tùy chỉnh của bạn để tránh đụng độ

+1

Tôi không nghĩ rằng tất cả các tham số đó là bắt buộc. –

1

Để mở rộng về câu trả lời elgui của, đây là một ví dụ về làm thế nào tôi phù hợp lên các cột:

@Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     final Cursor recentsCursor = super.query(uri, projection, selection, selectionArgs, sortOrder); 
     final Cursor customResultsCursor = queryCache(recentsCursor, selectionArgs[0]); 
     return new MergeCursor(new Cursor[]{recentsCursor, customResultsCursor}); 
    } 

    private Cursor queryCache(Cursor recentsCursor, String userQuery) { 
     final MatrixCursor arrayCursor = new MatrixCursor(recentsCursor.getColumnNames()); 

     final int formatColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT); 
     final int iconColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); 
     final int displayColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); 
     final int queryColumnIndex = recentsCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_QUERY); 
     final int idIndex = recentsCursor.getColumnIndex("_id"); 

     final int columnCount = recentsCursor.getColumnCount(); 

     // Populate data here 
     int startId = Integer.MAX_VALUE; 

     for (String customSearchResult : customSearchResults) { 
      final Object[] newRow = new Object[columnCount]; 
      if (formatColumnIndex >= 0) newRow[formatColumnIndex] = 0; 
      if (iconColumnIndex >= 0) newRow[iconColumnIndex] = R.drawable.invisible; 
      if (displayColumnIndex >= 0) newRow[displayColumnIndex] = customSearchResult; 
      if (queryColumnIndex >= 0) newRow[queryColumnIndex] = customSearchResult; 
      newRow[idIndex] = startId--; 
      arrayCursor.addRow(newRow); 
     }  

     return arrayCursor; 
    } 

Vì đây là dựa trên chi tiết thi hành SearchRecentSuggestionsProvider, nó vẫn có thể thất bại trong những tình huống khác và nó có thể là đáng giá hơn để viết lịch sử của riêng bạn và cùng nhau làm.