2012-01-29 15 views
6

Tôi đã đọc tất cả tài liệu trực tuyến về xây dựng giao diện tìm kiếm và thêm đề xuất tùy chỉnh ... nhưng tôi vẫn chưa rõ cách hoạt động của đề xuất này. Tài liệu nói rằng tôi phải "Xây dựng một bảng (chẳng hạn như trong một SQLiteDatabase) cho các đề xuất của bạn và định dạng bảng với các cột bắt buộc". Tôi giả sử hệ thống cuối cùng sẽ điền vào bảng này với các gợi ý thích hợp ... nhưng quá trình/lớp nào chịu trách nhiệm cho điều này, và khi nào việc chèn thực sự xảy ra (trước khi bất kỳ truy vấn nào được thực hiện bởi người dùng, sau một truy vấn đã được thực hiện bởi người sử dụng, vv)?SearchManager - thêm các đề xuất tùy chỉnh

Và mặc dù tôi đang đặt câu hỏi ở đây, nếu ai đó có thể làm rõ sự khác biệt giữa một số AutoCompleteTextView và một đề xuất tùy chỉnh w/custom SearchView ... thật tuyệt vời. AutoCompleteTextView có vẻ dễ dàng thực hiện dễ dàng so với SearchView (yêu cầu thay đổi đối với lớp trợ giúp ContentProvider, SQLiteDatabase, v.v.).

Trả lời

5

Bạn phải tạo nhà cung cấp nội dung cung cấp đề xuất tùy chỉnh của bạn dựa trên truy vấn cho đến nay được nhập trong chế độ xem tìm kiếm. Trong tệp có thể tìm kiếm của bạn, bạn định cấu hình độ dài tối thiểu của biểu thức tìm kiếm, phải đạt được trước khi yêu cầu gợi ý. Nhà cung cấp nội dung này được gọi là nhà cung cấp đề xuất (nó vẫn mở rộng ContentProvider). Quyền của nhà cung cấp nội dung cũng được định cấu hình trong searchable.xml.

Không có giới hạn về cách nhà cung cấp đề xuất tính toán đề xuất của nó. Bạn có thể tìm kiếm truy vấn web một cơ sở dữ liệu hoặc đọc một tệp. Nhưng câu trả lời cho truy vấn ở định dạng bảng. Nếu các đề xuất được truy vấn trực tiếp từ cơ sở dữ liệu, bạn có thể sử dụng con trỏ được trả lời bởi truy vấn cơ sở dữ liệu để phân phối kết quả trong phương thức query() của nhà cung cấp nội dung. Nếu kết quả được tính từ một hoặc nhiều nguồn, bạn có thể tạo bảng khi đang di chuyển bằng cách sử dụng một MatrixCursor.

Các hàng của câu trả lời từ nhà cung cấp đề xuất được cơ chế tìm kiếm sử dụng để hiển thị đề xuất, chúng được lưu trữ trong bảng. Định dạng của các hàng như sau:

private static final String[] COLUMNS = { 
    "_id", 
    SearchManager.SUGGEST_COLUMN_ICON_1,  // ID of a drawable (icon) as String 
    SearchManager.SUGGEST_COLUMN_TEXT_1,  // main text for suggestion display 
    SearchManager.SUGGEST_COLUMN_TEXT_2,  // secondary text for suggestion display 
    SearchManager.SUGGEST_COLUMN_INTENT_DATA, // this could be an URI to access the suggestion as used in an intent with a VIEW action 
    SearchManager.SUGGEST_COLUMN_INTENT_ACTION, // this could be Intent.ACTION_VIEW 
    SearchManager.SUGGEST_COLUMN_SHORTCUT_ID // e.g. SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT 
}; 

Searching được mô tả ở đây một cách chi tiết hơn: http://developer.android.com/guide/topics/search/index.html

+0

OK ... Tôi nghĩ rằng tôi đang bắt đầu hiểu. Nhưng khi nào/ở đâu là những gợi ý được chèn vào một bảng và các đề xuất có định dạng nào? Đó là những gì tôi đang bối rối. Tôi cho rằng loại tính năng đề xuất "tự động hoàn tất" này sẽ được triển khai bằng Trie hoặc một cái gì đó ... –

+0

tức là bảng đề xuất trông như thế nào? hoặc là bảng kết quả không nhất thiết phải là con người có thể đọc được? khi nào bảng này được tạo ra (bạn có cần phải tạo nó bằng cách sử dụng 'execSQL') không? –

+0

tôi muốn có tính năng tìm kiếm "tự động hoàn tất/đề xuất hoàn thành" đơn giản trên một cột nhất định trong cơ sở dữ liệu của tôi ... nhưng nếu nó có nghĩa là thay đổi toàn bộ cơ sở dữ liệu của tôi và gây rối với một loạt tệp, tôi luôn có thể quay lại cho nó vào một ngày sau đó (mặc dù tôi vẫn tin rằng điều này không nên mất nhiều thời gian để thực hiện! tất cả tôi muốn là hệ thống tự động hoàn thành trên một cột duy nhất của chuỗi trong cơ sở dữ liệu của tôi!). –