Autore Topic: SearchView in una SherlockActivity  (Letto 1790 volte)

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
SearchView in una SherlockActivity
« il: 16 Agosto 2013, 11:20:05 CEST »
0
Salve, ho implementato nel layout una SearchView, alla seguente maniera:

Codice (XML): [Seleziona]
<item android:id="@+id/menu_search" android:showAsAction="withText|ifRoom"
                android:actionViewClass="com.actionbarsherlock.widget.SearchView"
            android:icon="@drawable/ic_menu_search" android:title="Ricerca">
        </item>

Ma il mio problema è che non so come implementarlo nell'activity principale (che estende la SherlockActivity), in maniera da effettuare una vera e propria ricerca. Grazie in anticipo per l'aiuto  :D
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #1 il: 16 Agosto 2013, 13:02:41 CEST »
0
Qui è mostrato come implementare la SearchView in una SherlockActivity. Nell'esempio è fatto tutto da Java.
Per adattarlo al tuo codice, sostituisci
Codice (Java): [Seleziona]
SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());con
Codice (Java): [Seleziona]
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
« Ultima modifica: 16 Agosto 2013, 13:47:45 CEST da vincenzoc, Reason: aggiunto link »
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #2 il: 16 Agosto 2013, 13:22:03 CEST »
0
Si, ma come faccio a implementarla in modo che ricerchi quello scritto dentro?
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #3 il: 16 Agosto 2013, 13:50:48 CEST »
0
Avevo dimenticato di aggiungere il link nel post precedente, chiedo scusa  O:-)

Nel codice raggiungibile dal link vedi il metodo
Codice (Java): [Seleziona]
@Override
public boolean onQueryTextSubmit(String query) {
     Toast.makeText(this, "You searched for: " + query, Toast.LENGTH_LONG).show();
     return true;
}
all'interno del quale puoi eseguire le operazioni di ricerca :)
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #4 il: 16 Agosto 2013, 21:44:16 CEST »
0
Si ma così facendo qualsiasi cosa io scriva, otterrò sempre lo stesso risultato, io invece ho bisogno che a seconda da quello che viene scritto vada a cercare gli elementi da un array  :-o
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #5 il: 17 Agosto 2013, 13:07:50 CEST »
0
Si ma così facendo qualsiasi cosa io scriva, otterrò sempre lo stesso risultato, io invece ho bisogno che a seconda da quello che viene scritto vada a cercare gli elementi da un array  :-o

Beh a questo punto hai ciò che l'utente ha scritto nel riquadro di ricerca. Sta a te implementare il metodo di ricerca desiderato a seconda dei tipi di dati da cercare ed il risultato da restituire. Quello precedente era solo un esempio di come gestire l'input dell'utente
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #6 il: 20 Agosto 2013, 14:20:33 CEST »
0
E invece con una ListView se volessi fare che scrivendo il nome dell'elemento nella SearchView, andando scrivendo il nome vadano restando solo gli elementi che potrebbero essere, fino a rimanerne solo quello scritto? Scusami e grazie per la pazienza  :D
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #7 il: 20 Agosto 2013, 14:38:39 CEST »
+2
Implementi il metodo
Codice (Java): [Seleziona]
@Override
public boolean onQueryTextChange(String query) {
     //quello che devi fare
     return true;
}

All'interno di esso esegui le modifiche nella ListView. Per semplificare questo passaggio puoi fare riferimento ad una di queste:
:-)
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #8 il: 21 Agosto 2013, 11:48:54 CEST »
0
Ho seguito l'esempio del primo link e questo è quello che ho ottenuto:

Codice (Java): [Seleziona]
public class MainActivity extends SherlockActivity {
        private ListView mainListView;
        EditText inputSearch;
        private ArrayAdapter<String> listAdapter;
       
        /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grind);
        Context ctx = getApplicationContext();
        Resources res = ctx.getResources();
        mainListView = (ListView) findViewById( R.id.list);
        inputSearch = (EditText) findViewById(R.id.inputSearch);

       
        final String[] nomi = res.getStringArray(R.array.nomi);
        TypedArray immagini = res.obtainTypedArray(R.array.immagini);
 
        listAdapter = new TestImmagineAdapter(ctx, R.layout.lista, nomi, immagini);
       
        mainListView.setAdapter( listAdapter );
        mainListView.setTextFilterEnabled(true);
 
        inputSearch.addTextChangedListener(new TextWatcher() {
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                        MainActivity.this.listAdapter.getFilter().filter(cs);
                }
                        @Override
                        public void afterTextChanged(Editable arg0) {
                                // TODO Auto-generated method stub
                               
                        }
                        @Override
                        public void beforeTextChanged(CharSequence arg0, int arg1,
                                        int arg2, int arg3) {
                                // TODO Auto-generated method stub
                               
                        }
                });
Ma il problema è che qualsiasi cosa io scriva nell'EditText non succede niente  >:(
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #9 il: 21 Agosto 2013, 14:19:56 CEST »
0
Non stai usando la SearchView? Devi implementare il metodo onQueryTextChange() come ho indicato nel post precedente.

L'esempio su cui ti sei basato effettua la ricerca da un'EditText ed il funzionamento è diverso
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #10 il: 21 Agosto 2013, 15:08:45 CEST »
0
Ho seguito l'esempio del terzo link e  implementato questi 3 metodi:
Codice (Java): [Seleziona]
public boolean onQueryTextChange(String newText) {
        if (TextUtils.isEmpty(newText)) {
            listAdapter.getFilter().filter("");
            mainListView.clearTextFilter();
        } else {
            listAdapter.getFilter().filter(newText.toString());
        }
        return true;
    }

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

    public boolean onClose() {
        return false;
    }

Ma il risultato è sempre lo stesso  >:(

P.S questo è il mio adapter:
Codice (Java): [Seleziona]
package com.example.menu;

import android.content.Context;
import android.content.res.TypedArray;
import android.view.LayoutInflater;
import android.view.LayoutInflater.Filter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
 
public class TestImmagineAdapter extends ArrayAdapter<String> {
    private LayoutInflater mInflater;
 
    private String[] nomi;
    private TypedArray immagini;
 
    private int mIdRisorsaVista;
 
    public TestImmagineAdapter(Context ctx, int IdRisorsaVista, String[] strings, TypedArray icons) {
        super(ctx, IdRisorsaVista, strings);
        //per instanziare un file xml layout nel suo oggetto vista corrispondente
        mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        nomi = strings;
        immagini = icons;
 
        mIdRisorsaVista = IdRisorsaVista;
    }
 
    @Override
    public int getCount() {
        return nomi.length;
    }
 
    @Override
    public String getItem(int position) {
        return nomi[position];
    }
 
    @Override
    public long getItemId(int position) {
        return 0;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = mInflater.inflate(mIdRisorsaVista, null);
 
        ImageView iv = (ImageView)convertView.findViewById(R.id.immagine_vista);
        iv.setImageDrawable(immagini.getDrawable(position));
 
        TextView tv = (TextView)convertView.findViewById(R.id.testo_vista);
        tv.setText(nomi[position]);
 
        return convertView;
    }
}
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #11 il: 21 Agosto 2013, 16:06:28 CEST »
0
Guarda la prima risposta al terzo link che mostra come gestire correttamente il Filter.
Devi implementare il metodo getFilter() nell'adapter
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #12 il: 21 Agosto 2013, 17:02:29 CEST »
0
Ma non riesco a capire come implementarlo correttamente nel mio adapter..
Vincenzo Cimino @ Google Play Store


Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:SearchView in una SherlockActivity
« Risposta #13 il: 21 Agosto 2013, 17:22:01 CEST »
+1
L'adapter:
Codice (Java): [Seleziona]
package com.example.menu;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.content.Context;
import android.content.res.TypedArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;
 
public class TestImmagineAdapter extends ArrayAdapter<String> {
    private LayoutInflater mInflater;
 
    private String[] nomi;
    private TypedArray immagini;
    private List<String> stringhe;
    private List<String> origData;

 
    private int mIdRisorsaVista;
 
    public TestImmagineAdapter(Context ctx, int IdRisorsaVista, String[] strings, TypedArray icons) {
        super(ctx, IdRisorsaVista, strings);
        //per instanziare un file xml layout nel suo oggetto vista corrispondente
        mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        nomi = strings;
        immagini = icons;
        stringhe=Arrays.asList(strings);
        origData=new ArrayList<String>(this.stringhe);
 
        mIdRisorsaVista = IdRisorsaVista;
    }
 
    @Override
    public int getCount() {
        return nomi.length;
    }
 
    @Override
    public String getItem(int position) {
        return nomi[position];
    }
 
    @Override
    public long getItemId(int position) {
        return 0;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = mInflater.inflate(mIdRisorsaVista, null);
 
        ImageView iv = (ImageView)convertView.findViewById(R.id.immagine_vista);
        iv.setImageDrawable(immagini.getDrawable(position));
 
        TextView tv = (TextView)convertView.findViewById(R.id.testo_vista);
        tv.setText(nomi[position]);
 
        return convertView;
    }


@Override
public android.widget.Filter getFilter(){
   return new Filter(){

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
             constraint = constraint.toString().toLowerCase();
             FilterResults result = new FilterResults();

                if (constraint != null && constraint.toString().length() > 0) {
                  List<String> founded = new ArrayList<String>();
                        for(String item: stringhe){
                            if(item.toString().toLowerCase().contains(constraint)){
                                founded.add(item);
                            }
                    }

                        result.values = founded;
                        result.count = founded.size();
                    }else {
                        result.values = origData;
                        result.count = origData.size();
                    }
            return result;


    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
           clear();
           for (String item : (List<String>) results.values) {
                 add(item);
           }
    notifyDataSetChanged();

    }

    };
    }


}

Ho adattato velocemente il codice e non ho neanche avuto modo di provarlo, vedi se gira
« Ultima modifica: 21 Agosto 2013, 17:34:42 CEST da vincenzoc, Reason: aggiunti gli import »
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:SearchView in una SherlockActivity
« Risposta #14 il: 21 Agosto 2013, 17:35:58 CEST »
0
Ok, infine dato che in quella maniera dava troppi problemi, ho implementato in questa maniera:

Codice (Java): [Seleziona]
public class MainActivity extends SherlockActivity implements SearchView.OnQueryTextListener {
        private ListView mainListView;
        private Menu mainMenu = null;
        public SearchView mSearchView;
        private ArrayList<String> array_ris;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grind);
       
array_ris=new ArrayList<String> (Arrays.asList(nomiTrick));
...
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getSupportMenuInflater().inflate(R.menu.main, menu);
        mainMenu = menu;

        MenuItem searchItem = menu.findItem(R.id.menu_search);
       
        mSearchView = (SearchView) searchItem.getActionView();
        setupSearchView(searchItem);

    Log.i("Nomad", "after setupSearchView()");
        return true;
    }
                return true;
        }
       
        private void setupSearchView(MenuItem searchItem) {
         mSearchView.setIconifiedByDefault(true);
         mSearchView.setOnQueryTextListener(this);
         mSearchView.setSubmitButtonEnabled(false);
       
         searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT | MenuItem.SHOW_AS_ACTION_IF_ROOM);
        }

public boolean onQueryTextChange(String newText) {
         Log.i("Nomad", "onQueryTextChange");
         int textlength = newText.length();
         array_ris.clear();
         Context ctx = getApplicationContext();
         Resources res = ctx.getResources();
         mainListView = (ListView) findViewById( R.id.list);
         final String[] nomiTrick = res.getStringArray(R.array.nomi);
         TypedArray immagini = res.obtainTypedArray(R.array.immagini);
         
         for (int i = 0; i < nomi.length; i++)
         {
             if (textlength <= nomi[i].length())
             {
                 if(nomi[i].toLowerCase().contains(newText.toLowerCase().trim()))
                 {
                    Log.i("Nomad", "onQueryTextChange " + newText.toString());
                         array_ris.add(nomi[i]);
                 }
               }
         }
         mainListView.setAdapter( new TestImmagineAdapter(ctx, R.layout.grind_lista, array_ris.toArray(new String[array_ris.size()]), immagini) );
        return true;
        }
       
        public boolean onQueryTextSubmit(String query) {
        Log.i("Nomad", "onQueryTextSubmit");
        return false;
        }
       
        public boolean onClose() {
        Log.i("Nomad", "onClose");
        return false;
        }
« Ultima modifica: 22 Agosto 2013, 13:52:47 CEST da Vincenzoz, Reason: Merged DoublePost »
Vincenzo Cimino @ Google Play Store