Създайте история за SearchView на ActionBar

Искам да имам история в моя SearchView, търсих в Google и единственият разумен (?) урок, който намерих, беше това, но това е само за 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:

res/menu/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" />

MainActivity.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
Това решение е непълно и трябва да се смеси с това: stackoverflow .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 връща курсор, за да можете да получите String или нещо друго и в крайна сметка история на търсенето.

Пример:

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