Создать историю для SearchView на ActionBar

Я хочу иметь историю в моем SearchView, я гуглил, и единственный разумный (?) Учебник, который я нашел, был это, но это только для Gingerbread, а не для API>14.

Затем я нашел этот код:

String[] columnNames = {"_id","text"};
        MatrixCursor cursor = new MatrixCursor(columnNames);
        String[] array = {"Snääälla", "bla bla bla", "Jävla piss"}; //if strings are in resources
        String[] temp = new String[2];
        int id = 0;
        for(String item : array){
            temp[0] = Integer.toString(id++);
            temp[1] = item;
            cursor.addRow(temp);
        }
        String[] from = {"text"};
        int[] to = {android.R.id.text1};
        CursorAdapter ad = new SimpleCursorAdapter(this.getActivity(), android.R.layout.simple_list_item_1, cursor, from, to);
        mSearchView.setSuggestionsAdapter(ad);

И этот код работает только наполовину, поскольку он не показывает результатов того, что вы уже написали, он показывает все элементы.

Я просто хочу, чтобы это выглядело так:

Снимок экрана Google Play Store

Это мой текущий код для добавления SearchView:

рез/меню/menu.xml:

<item android:id="@+id/fragment_searchmenuitem"
      android:icon="@drawable/ic_search_white"
      android:title="@string/menu_search"
      android:showAsAction="collapseActionView|ifRoom"
      android:actionViewClass="android.widget.SearchView" />

Основная активность.java:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if(!mDrawerLayout.isDrawerOpen(mDrawerList)) {
        inflater.inflate(R.menu.fragment_search, menu);

        mMenuItem = menu.findItem(R.id.fragment_searchmenuitem);
        mSearchView = (SearchView) mMenuItem.getActionView();
        mMenuItem.expandActionView();
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                mMenuItem.collapseActionView();
                searchSupport.SearchForLyrics(s);
                actionBar.setSubtitle("Searcing for: " + s);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                return false;
            }
        });
    }

    super.onCreateOptionsMenu(menu, inflater);
}

Может кто-нибудь, пожалуйста, дайте мне что-нибудь, с чего начать, честно говоря, я понятия не имею, с чего начать. Поэтому любая помощь будет очень признательна.


person GuiceU    schedule 03.10.2013    source источник
comment
Вы когда-нибудь думали о том, чтобы сохранить их в своей базе данных, а затем с помощью автоматического полного текстового просмотра получить его из базы данных с помощью адаптера курсора?   -  person Terril Thomas    schedule 03.10.2013
comment
@TerrilThomas Да, да, знаю. Но я надеялся, что у Google будут какие-то официальные API или что-то в этом роде.   -  person GuiceU    schedule 03.10.2013


Ответы (2)


На этой странице рассказывается о том, как реализовать историю для SearchView.

http://developer.android.com/guide/topics/search/adding-recent-query-suggestions.html

Во-первых, вам нужно создать поставщика контента:

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

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

Затем объявите поставщика контента в манифесте приложения следующим образом:

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

Затем добавьте поставщика контента в доступные для поиска конфигурации следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

Вы можете вызвать saveRecentQuery() для сохранения запросов в любое время. Вот как вы можете сделать это в методе onCreate для своей активности:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

Чтобы очистить историю поиска, вам просто нужно вызвать метод SearchRecentSuggestions clearHistory() следующим образом:

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();
person iSWORD    schedule 03.09.2014
comment
Это решение является неполным, и его необходимо смешать с этим: .com/questions/21585326/. Если обнаружится, лучше всего реализовать собственный адаптер предложения, если приложение каким-либо образом связано с темой. - person 3c71; 14.10.2015
comment
Здравствуйте, если я хочу получить все последние поисковые предложения из базы данных предложений и показать их, когда пользователь ничего не написал, просмотрите поиск. - person Vishal Thakkar; 19.04.2019

Я использую Fragment для SeaarchView на ActionBar, поэтому у меня есть собственный слушатель, такой как setOnSuggestionListener, setOnQueryTextListener. Когда я пишу searchview.setSearchableInfo(), мой адаптер перестает работать. Итак, я посмотрел на функцию setSearchableInfo и извлек некоторый код для самостоятельного получения данных поиска в истории из основного кода.

class MySearchableInfoClass internal constructor(
private val mContext: Context,
private val mSearchable: SearchableInfo
 ) {

private val QUERY_LIMIT = 5


private fun getSearchManagerSuggestions(
    searchable: SearchableInfo?,
    query: String,
    limit: Int
): Cursor? {
    if (searchable == null) {
        return null
    }

    val authority = searchable.suggestAuthority ?: return null

    val uriBuilder = Uri.Builder()
        .scheme(ContentResolver.SCHEME_CONTENT)
        .authority(authority)
        .query("")  // TODO: Remove, workaround for a bug in Uri.writeToParcel()
        .fragment("")  // TODO: Remove, workaround for a bug in Uri.writeToParcel()

    // if content path provided, insert it now
    val contentPath = searchable.suggestPath
    if (contentPath != null) {
        uriBuilder.appendEncodedPath(contentPath)
    }

    // append standard suggestion query path
    uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY)

    // get the query selection, may be null
    val selection = searchable.suggestSelection
    // inject query, either as selection args or inline
    var selArgs: Array<String>? = null
    if (selection != null) {    // use selection if provided
        selArgs = arrayOf(query)
    } else {                    // no selection, use REST pattern
        uriBuilder.appendPath(query)
    }

    if (limit > 0) {
        uriBuilder.appendQueryParameter("limit", limit.toString())
    }

    val uri = uriBuilder.build()

    // finally, make the query
    return mContext.contentResolver.query(uri, null, selection, selArgs, null)
}

fun getSearchHistoryCursor(constraint: CharSequence?): Cursor? {
    val query = constraint?.toString() ?: ""
    var cursor: Cursor? = null

    try {
        cursor = getSearchManagerSuggestions(mSearchable, query, QUERY_LIMIT)
        // trigger fill window so the spinner stays up until the results are copied over and
        // closer to being ready
        if (cursor != null) {
            cursor.count
            return cursor
        }
    } catch (e: RuntimeException) {

    }

    // If cursor is null or an exception was thrown, stop the spinner and return null.
    // changeCursor doesn't get called if cursor is null
    return null
}
}

getSearchHistoryCursor возвращает курсор, поэтому вы можете получить строку или что-то еще и, в конечном итоге, выполнить поиск в истории.

Пример:

cursor.getString(cursor.getColumnIndex("suggest_text_1")))
person Abdurrahman Oğuzhan Durmaz    schedule 09.12.2020