Vra

Ek is die bou van die soektog in 'n aansoek en behoefte aan 'n manier om die voorstelle wat ek kry van my bediener as 'n into-reeks in die lys van voorstelle wat onder die Snelzoekvak vertoon het.

Is daar 'n maklike manier om die Snelzoekvak gelees sulke hulpbronne?

Op die oomblik is ek besig om 'n ContentProvider gebruik, maar die koppelvlak metodes duidelik een veronderstel is om te gebruik daarvan 'n databasis van die voorstelle te kry. Ek dink die gebruik van 'n ContentProvider is die korrekte manier as jy op soek is na die data wat gestoor word in die aansoek. Ek is nie so seker maar dat dit op die regte manier as wat jy nodig het om 'n netwerk hulpbron navraag.

Dit maak nie sin vir my om die voorstelle wat ek kry van die netwerk na 'n plaaslike databasis red, as die voorstelle en hul trefkoers sal wissel van tyd tot tyd.

Enigiemand het hierdie kwessie? Of kan my wys in die rigting van 'n soortgelyke vraag? Ek kon hier nie vrae te vind op stapel wat genoem netwerk voorstelle.

Was dit nuttig?

Oplossing

Resultate die oplossing op developer.android.com:

As jy voorstelle wat jy kry van 'n netwerk plek, kan jy 'n loper te bou op die vlieg wanneer jy die resultate te kry van jou bediener.

Dit gaan binne-in jou ContentProvider se navraag () metode:

String[] columns = {
   BaseColumns._ID, 
   SearchManager.SUGGEST_COLUMN_TEXT_1, 
   SearchManager.SUGGEST_COLUMN_INTENT_DATA
};

MatrixCursor cursor = new MatrixCursor(columns);

for (int i = 0; i < arr.length(); i++)
{
  String[] tmp = {Integer.toString(i), arr.getString(i), arr.getString(i)};
  cursor.addRow(tmp);
}
return cursor;

Die wyser is die gebruik in die vinnige-soekkassie om 'n lys van voorstelle in te vul.

Ander wenke

Hier is 'n voorbeeld van Soek-aansig met voorstelle kom uit 'n netwerk diens (ek gebruik Skakels):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_search_activity, menu);

        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));

        final CursorAdapter suggestionAdapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                null,
                new String[]{SearchManager.SUGGEST_COLUMN_TEXT_1},
                new int[]{android.R.id.text1},
                0);
        final List<String> suggestions = new ArrayList<>();

        searchView.setSuggestionsAdapter(suggestionAdapter);
        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
            @Override
            public boolean onSuggestionSelect(int position) {
                return false;
            }

            @Override
            public boolean onSuggestionClick(int position) {
                searchView.setQuery(suggestions.get(position), false);
                searchView.clearFocus();
                doSearch(suggestions.get(position));
                return true;
            }
        });

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                MyApp.autocompleteService.search(newText, new Callback<Autocomplete>() {
                    @Override
                    public void success(Autocomplete autocomplete, Response response) {
                        suggestions.clear();
                        suggestions.addAll(autocomplete.suggestions);

                        String[] columns = {
                                BaseColumns._ID,
                                SearchManager.SUGGEST_COLUMN_TEXT_1,
                                SearchManager.SUGGEST_COLUMN_INTENT_DATA
                        };

                        MatrixCursor cursor = new MatrixCursor(columns);

                        for (int i = 0; i < autocomplete.suggestions.size(); i++) {
                            String[] tmp = {Integer.toString(i), autocomplete.suggestions.get(i), autocomplete.suggestions.get(i)};
                            cursor.addRow(tmp);
                        }
                        suggestionAdapter.swapCursor(cursor);
                    }

                    @Override
                    public void failure(RetrofitError error) {
                        Toast.makeText(SearchFoodActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                        Log.w("autocompleteService", error.getMessage());
                    }
                });
                return false;
            }
        });

        return true;
}

Weet nie of mense dit nog nodig. Net in geval, vir toekomstige gebruikers. Ek het 'n probleem met voorstelle my Soek-aansig se, wat nie opdaag nie. Na deursoek rondom, het ek gevind dat 'n oplossing vir hierdie. Ek gebruik Volley vir my inhoudverskaffer klas, wat gelyk nie om natuurlik inpas by inhoudverskaffer raamwerk Android se (om die voorstelle van web api kry). Ek het ook gevind dat my inhoudverskaffer BETEKEN hardloop in die UI draad. Daarom, as ek Volley se toekoms gebruik sinkronies in dit, dit vertraag (geblokkeer) die UI tot die versoek teruggekeer (tydverstreke). Daarbenewens, het ek gevind dat inligting rondom die web is dat toekomstige aanvraag Volley se moet uitgevoer word in ander draad, soos in 'n A-sinkroniseer taak, want dit om goed te werk. Dus, het dit nie my probleem op te los, want as ek wil hê om dit te gebruik (in 'n asinkroniseer taak), sou ek normaal (asinkroniseer) versoek Volley se in die eerste plek in plaas gebruik (wat was wat ek gebruik dan). Wat ek gedoen het, was dit:

  1. In my ContentProvider subklas, ek definieer 'n luisteraar koppelvlak:

    openbare koppelvlak ResultListener {

      void onProviderResult(Cursor mCursor);
    
      void onProviderError(String errorMsg);
    

    }

  2. In my aktiwiteit (wat LoaderCallbacks geïmplementeer), geïmplementeer Ek ook bo-koppelvlak.

  3. In my Singleton aansoek klas, ek definieer 'n statiese veranderlike wat gebruik word as verbygaande data, saam met sy lucky / setter metodes:

    private statiese HashMap transientData = nuwe HashMap ();

    openbare statiese Object getTransientData (String Object) {

    return transientData.get(objectName);
    

    }

    openbare statiese nietig setTransientData (String Object, Object voorwerp) {

    transientData.put(objectName, object);
    

    }

  4. nou die logika: In die aktiwiteit, voordat hy getSupportLoaderManager (). InitLoader (...) , Ek het MyApplication.setTransientData ( "versoeker", hierdie) :

In die klas my inhoudverskaffer se in onResponse terugbel die volley se versoek, het ek hierdie:

public void onResponse (JSONArray reaksie) {

  ...

  ResultListener requestor =   (ResultListener)TheApplication.getTransientData("requestor");

  if (requestor!=null) requestor.onProviderResult(mCursor);

}

Om te verseker dat wanneer die volley versoek teruggekeer, sal dit die aansoeker se terugbel metode aktiveer, om dit die wyser gevul met data uit die reaksie, en op sy beurt die aansoeker (die aktiwiteit) in kennis gestel die wyser adapter deur te bel:       adapter.swapCursor (c);       adapter.notifyDataSetChanged ();

Hoop dit help iemand. Geseënd wees.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top