Autore Topic: Intercettare evento touch prolungato listview  (Letto 1409 volte)

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Intercettare evento touch prolungato listview
« il: 10 Febbraio 2014, 23:33:46 CET »
0
Come posso catturare l'evento touch prolungato ? Mi spiego meglio ; Io ho una lista com doversi item , quando tengo il dito premuto su un certo item per un tot di tempo voreo che mi comparisse magari un menu ( anche se è brutto un menu con una sola voce ) dove mi chiede se voglio eliminare l'item o no
Quindi come faccio a captare il touch prolungato ? ( visto che se la premi per poco ti entra in un altra list view )


Grazie , Trotto23

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Intercettare evento touch prolungato listview
« Risposta #1 il: 11 Febbraio 2014, 08:31:31 CET »
0
Hai provato con l' OnItemLongClickListener ?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Intercettare evento touch prolungato listview
« Risposta #2 il: 11 Febbraio 2014, 15:21:49 CET »
0
Io ho una cosa del genere :

ho la mia lista mListView

Codice (Java): [Seleziona]
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
          @Override
           public void onItemClick(AdapterView<?> l, View v, int position, long id)
           {
                        openThread(mCursorAdapter.getItemId(position));
           }
};

Usando la funzione che mi hai detto te dovrei fare una cosa cosi ?

Codice (Java): [Seleziona]
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
        @Override
        public void onItemClick(AdapterView<?> l, View v, int position, long id)
        {
                openThread(mCursorAdapter.getItemId(position));
        }
        });


mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
        @Override
        public void onItemLongClick(AdapterView<?> l, View v, int position, long id)
        {
                //Qua devo fare quello che voglio che faccia quando c'è un touch prolungato;
        }
        });

Offline BobArctor

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero, Galaxy S4, GP50
  • Play Store ID:
    Michele Valentini
  • Sistema operativo:
    Windows 8
Re:Intercettare evento touch prolungato listview
« Risposta #3 il: 11 Febbraio 2014, 15:30:35 CET »
0
Esatto... qui ho messo una parte di codice in piu con una dialog per eliminare l'elemento.

Codice (Java): [Seleziona]
mListView
                                .setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                                        @Override
                                        public boolean onItemLongClick(AdapterView<?> adapter,
                                                        View view, final int position, long id) {
                                                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                                                MainActivity.this);
                                                alertDialogBuilder
                                                                .setTitle(R.string.alert_delete_title);
                                                alertDialogBuilder
                                                                .setMessage(R.string.alert_delete_text);
                                                alertDialogBuilder.setCancelable(false);
                                                alertDialogBuilder.setPositiveButton(R.string.yes,
                                                                new DialogInterface.OnClickListener() {
                                                                        @Override
                                                                        public void onClick(
                                                                                        DialogInterface dialogInterface,
                                                                                        int i) {
                                                                                mAdapter.remove(mAdapter
                                                                                                .getItem(position));
                                                                                mAdapter.notifyDataSetChanged();
                                                                        }
                                                                });
                                                alertDialogBuilder.setNegativeButton(R.string.no,
                                                                new DialogInterface.OnClickListener() {
                                                                        @Override
                                                                        public void onClick(
                                                                                        DialogInterface dialogInterface,
                                                                                        int i) {
                                                                                dialogInterface.cancel();
                                                                        }
                                                                });
                                                AlertDialog alertDialog = alertDialogBuilder.create();
                                                alertDialog.show();
                                                mAdapter.notifyDataSetChanged();
                                                return true;
                                        }
                                });

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Intercettare evento touch prolungato listview
« Risposta #4 il: 11 Febbraio 2014, 15:53:53 CET »
0
Guarda , inanzi tutto ti ringrazio per l' aiuto . Cortesemente ti chiedo se puoi spiegarmi il pezzo di codice che hai citato, non vorrei mettere nel mio progetto del codice di cui non so il significato. Grazie





Trotto23

Offline BobArctor

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero, Galaxy S4, GP50
  • Play Store ID:
    Michele Valentini
  • Sistema operativo:
    Windows 8
Re:Intercettare evento touch prolungato listview
« Risposta #5 il: 11 Febbraio 2014, 16:02:31 CET »
0
ho inserito dei commenti nel codice :)
Codice (Java): [Seleziona]
mListView
                                .setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                                        @Override
                                        public boolean onItemLongClick(AdapterView<?> adapter,
                                                        View view, final int position, long id) {
                                                //Creazione dell'alert dialog
                                                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                                                MainActivity.this);
                                                //imposto il titolo ed il messaggio dell'alert dialog, prendendolo dalle Resources
                                                alertDialogBuilder
                                                                .setTitle(R.string.alert_delete_title);
                                                alertDialogBuilder
                                                                .setMessage(R.string.alert_delete_text);
                                                 //questo dialog non verrà annullato tappando sullo schermo al di fuori del dialog stesso
                                                alertDialogBuilder.setCancelable(false);
                                                //imposto il clicklistener del pulsante "yes" ed il suo testo sempre dalle Resources
                                                alertDialogBuilder.setPositiveButton(R.string.yes,
                                                                new DialogInterface.OnClickListener() {
                                                                        @Override
                                                                        public void onClick(
                                                                                        DialogInterface dialogInterface,
                                                                                        int i) {
                                                                                //rimuovo l'oggetto dalla posizione "position" (quella attualmente selezionata)
                                                                                mAdapter.remove(mAdapter
                                                                                                .getItem(position));
                                                                                //aggiorno la vista
                                                                                mAdapter.notifyDataSetChanged();
                                                                        }
                                                                });
                                                alertDialogBuilder.setNegativeButton(R.string.no,
                                                                new DialogInterface.OnClickListener() {
                                                                        @Override
                                                                        public void onClick(
                                                                                        DialogInterface dialogInterface,
                                                                                        int i) {
                                                                                 //in caso di pressione del tasto "no" (negative) chiudo il dialog senza alcuna azione
                                                                                dialogInterface.cancel();
                                                                        }
                                                                });
                                                //dopo averne dichiarato le proprietà creo l'istanza del dialog
                                                AlertDialog alertDialog = alertDialogBuilder.create();
                                                //lo mostro
                                                alertDialog.show();
                                                mAdapter.notifyDataSetChanged();
                                                return true;
                                        }
                                });

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Intercettare evento touch prolungato listview
« Risposta #6 il: 11 Febbraio 2014, 16:05:22 CET »
0
Questo e' il  mio codice sopra:
Codice (Java): [Seleziona]
mCursorAdapter = new ThreadsCursorAdapter(this);
mListView.setAdapter(mCursorAdapter);


Comunque compilandolo mi un errore in questa riga:
Codice (Java): [Seleziona]
mCursorAdapter.remove(mCursorAdapter.getItem(position));
 //Precisamente su remove (The method remove(Object) is undefined for the type CursorAdapter , add cast to mCursorAdapter


Il codice che mi hai passato te l'ho inserito così nel mio progetto adattandolo alle mie variabili:


Codice (Java): [Seleziona]
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
                {
                        @Override
                    public boolean onItemLongClick(AdapterView<?> adapter,View view, final int position, long id) {
                                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ThreadsActivity.this);
                        alertDialogBuilder.setTitle("Alert delete title");
                        alertDialogBuilder.setMessage("Alert delete text");
                        alertDialogBuilder.setCancelable(false);
                                alertDialogBuilder.setPositiveButton("Si", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface,int i){
                                mCursorAdapter.remove(mCursorAdapter.getItem(position));
                                mCursorAdapter.notifyDataSetChanged();
                        }
                });
                                                               
                        alertDialogBuilder.setNegativeButton("No",new DialogInterface.OnClickListener() {
                                @Override
                        public void onClick(DialogInterface dialogInterface,int i) {
                                        dialogInterface.cancel();
                        }      
                        });
                   
                        AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();
                    mCursorAdapter.notifyDataSetChanged();
                    return true;
                                }
                          });




Offline BobArctor

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero, Galaxy S4, GP50
  • Play Store ID:
    Michele Valentini
  • Sistema operativo:
    Windows 8
Re:Intercettare evento touch prolungato listview
« Risposta #7 il: 11 Febbraio 2014, 16:12:49 CET »
0
mmm... il metodo "remove" lo ho perchè il mio mAdapter è un'implementazione di ArrayAdapter... :(

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Intercettare evento touch prolungato listview
« Risposta #8 il: 11 Febbraio 2014, 16:14:47 CET »
0
Quindi io come dovrei fare :S ?

Offline Alexander_br

Re:Intercettare evento touch prolungato listview
« Risposta #9 il: 11 Febbraio 2014, 17:25:50 CET »
0
ciao io per il long click faccio così (chè più o meno quello che fa BobArctor). Cmq nell' OnActvityCreated fai:

Codice (Java): [Seleziona]
getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View v, final int position, long id) {
                       
                        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                                builder.setTitle(getResources().getString(R.string.deleteQuestion));
                                builder.setCancelable(true);
                                builder.setPositiveButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
                                       
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {

                                                // fai qui quello che vuoi venga fatto con il long click
                                                reloadFragmentList(getActivity());
                                        }
                                });
                                builder.setNegativeButton(getResources().getString(R.string.cancel), null);
                               
                                AlertDialog deleteDialog = builder.create();
                                deleteDialog.show();
                               
                    return true;
                }
            });


Io mi chiamo un metodo che mi sono fatto che serve ad aggiornarmi l'adapter. Ho capito che fare il remove() sul singolo item dell'adapter non è possibile quindi ogni volta che cliccavo mi segnavo l'id dell'elemento e lo eliminavo dal db. Poi mi chiamavo il realodFragmentList() per ricaricarmi tutto l'adapter. Ti consiglio di fare così.
Banalmente in questo metodo puoi fare una cosa tipo

Codice (Java): [Seleziona]
        public void reloadFragmentList(Context context){
               
                adapter.notifyDataSetChanged();

                String[] list = new String[list.size()];
               
                adapter = new RowListviewAdapter(context,android.R.layout.simple_list_item_1, list);
                setListAdapter(adapter);
               
        }// reloadFragmentList
"l'arte sfida la tecnologia e la tecnologia ispira l'arte" cit.

https://www.facebook.com/letsmakeaps

Offline BobArctor

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero, Galaxy S4, GP50
  • Play Store ID:
    Michele Valentini
  • Sistema operativo:
    Windows 8
Re:Intercettare evento touch prolungato listview
« Risposta #10 il: 11 Febbraio 2014, 17:32:47 CET »
0
potresti aggiungere un metodo removeItemById al DbHelper, a cui passi l'id dell'oggetto selezionato e lo rimouvi, aggiornando mListView al termine.

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Intercettare evento touch prolungato listview
« Risposta #11 il: 11 Febbraio 2014, 17:40:56 CET »
0
Grazie Mille ragazzi per il vostro aiuto , vi ringrazio.
BobArctor , come faccio a fare una funzione se non posso implementare la funzione remove ?
Alexander puoi spiegarmi il codice che hai postato ? Non lo ho capito


Grazie mille , Trotto_23

Offline Alexander_br

Re:Intercettare evento touch prolungato listview
« Risposta #12 il: 11 Febbraio 2014, 18:14:30 CET »
0
ciao Trotto23 quale delle due parti non ti è chiara?

Nella prima parte del codice metto nell'OnActvityCreated il setOnItemLongClickListener che serve appunto per il long click in cui dentro semplicemente mi creo una finestra di alert che ti chiede "Vuoi eliminare l'elemento selezionato?". Quindì nell' onCLick del setPositiveButton metto tutto quello che serve venga fatto al click prolungato. Nel tuo caso vedevo che facevi una cosa tipo

Codice (Java): [Seleziona]
mCursorAdapter.remove(mCursorAdapter.getItem(position));
Il tuo adapter lo crei dinamicamente prendendo dati da una query o usando un array statico?
"l'arte sfida la tecnologia e la tecnologia ispira l'arte" cit.

https://www.facebook.com/letsmakeaps

Offline Trotto23

  • Utente junior
  • **
  • Post: 94
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows Vista
Re:Intercettare evento touch prolungato listview
« Risposta #13 il: 11 Febbraio 2014, 22:18:39 CET »
0
Oddio , lo creo dinamicamente visto che non ha un numero di item costante
 
Comunque per chiarezza ti posto tutto il mio codice :

Codice (Java): [Seleziona]
public class ThreadsActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {

        private ListView mListView;

        private CursorAdapter mCursorAdapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                // Controlla che il telefono sia stato registrato.
                SharedPreferences prefs = getSharedPreferences("registration", Context.MODE_PRIVATE);
                if (!prefs.getBoolean("registered", false)) {
                        // Termina l'attività corrente.
                        finish();
                    // Non registrato, lancia l'attività di registrazione.
                        startActivity(new Intent(this, RegistrationActivity.class));
                        // Esce dal metodo.
                        return;
                }
                // Carica il layout ed associa gli eventi.
                setContentView(R.layout.activity_threads);
                // Associa la lista
                mListView = (ListView) findViewById(R.id.listview);
                mCursorAdapter = new ThreadsCursorAdapter(this);
                mListView.setAdapter(mCursorAdapter);
               
                //Gestire il touch di un item
                mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> l, View v, int position, long id) {
                                openThread(mCursorAdapter.getItemId(position));
                        }
                });
               
               
               
               
               
                //Gestisce touch prolungato di un item
                mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
                {
                        @Override
                    public boolean onItemLongClick(AdapterView<?> adapter,View view, final int position, long id) {
                                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ThreadsActivity.this);
                        alertDialogBuilder.setTitle("Alert delete title");
                        alertDialogBuilder.setMessage("Alert delete text");
                        alertDialogBuilder.setCancelable(false);
                                alertDialogBuilder.setPositiveButton("Si", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface,int i){
                                //Rimuove item selezionato
                                mCursorAdapter.remove(mCursorAdapter.getItem(position)); //<-qua vi e' l'errore
                                //Referesh
                                mCursorAdapter.notifyDataSetChanged();
                        }
                });
                                                               
                        alertDialogBuilder.setNegativeButton("No",new DialogInterface.OnClickListener() {
                                @Override
                        public void onClick(DialogInterface dialogInterface,int i) {
                                        dialogInterface.cancel();
                        }      
                        });
                   
                        AlertDialog alertDialog = alertDialogBuilder.create();
                    alertDialog.show();
                    mCursorAdapter.notifyDataSetChanged();
                    return true;
                                }
                          });

Post unito: 12 Febbraio 2014, 11:18:22 CET
ciao Trotto23 quale delle due parti non ti è chiara?

Nella prima parte del codice metto nell'OnActvityCreated il setOnItemLongClickListener che serve appunto per il long click in cui dentro semplicemente mi creo una finestra di alert che ti chiede "Vuoi eliminare l'elemento selezionato?". Quindì nell' onCLick del setPositiveButton metto tutto quello che serve venga fatto al click prolungato. Nel tuo caso vedevo che facevi una cosa tipo

Codice (Java): [Seleziona]
mCursorAdapter.remove(mCursorAdapter.getItem(position));
Il tuo adapter lo crei dinamicamente prendendo dati da una query o usando un array statico?


 il problema è  nell'
Codice (Java): [Seleziona]
mCursorAdapter.remove(mCursorAdapter.getItem(position));
« Ultima modifica: 12 Febbraio 2014, 11:18:22 CET da Trotto23, Reason: Merged DoublePost »

Offline Alexander_br

Re:Intercettare evento touch prolungato listview
« Risposta #14 il: 12 Febbraio 2014, 11:27:23 CET »
0
ok perfetto! Ti da errore perchè da documentazione http://developer.android.com/reference/android/widget/CursorAdapter.html la classe CursorAdapter non ha il metodo remove.

Però è semplice basta farti un metodo della tua classe ThreadsCursorAdapter tipo setItemToBeRemove() in cui banalmente setti l'id che vuoi rimuovere dal db e ti riqueri tutto. A questo punto basta ricaricarti e aggiornare l'adapter.
"l'arte sfida la tecnologia e la tecnologia ispira l'arte" cit.

https://www.facebook.com/letsmakeaps