2012-01-13 6 views
124

Voglio aggiungere OnLongClickListener alla mia visualizzazione elenco. Ogni volta che l'utente preme a lungo l'elemento nell'elenco, è necessario eseguire alcune azioni, ma il mio codice non cattura l'ascoltatore. Per favore fatemi sapere dove sto andando male. Il codice simile funziona per setOnItemClickListener molto bene.come implementare un listener di clic lungo su un listview

Ecco il codice:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

      public boolean onItemLongClick(AdapterView<?> arg0, View v, 
        int index, long arg3) { 
       // TODO Auto-generated method stub 
       Log.d("in onLongClick"); 
       String str=listView.getItemAtPosition(index).toString(); 

       Log.d("long click : " +str); 
       return true; 
      } 
}); 
+0

vedere in xml se il clic lungo è abilitato? –

+0

Ti sei ricordato di aggiungere "implementa OnItemLongClickListener" alla tua dichiarazione di classe? – barry

+0

Forse hai un ascoltatore di gesti o qualcosa del genere che sta catturando la stampa lunga e consumandola. –

risposta

281

è necessario impostare setOnItemLongClickListener() nella ListView:

lv.setOnItemLongClickListener(new OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
        int pos, long id) { 
       // TODO Auto-generated method stub 

       Log.v("long clicked","pos: " + pos); 

       return true; 
      } 
     }); 

Il XML per ogni elemento della lista (si dovrebbe utilizzare un XML personalizzato) deve avere android:longClickable="true" così (oppure è possibile utilizzare il metodo di convenienza lv.setLongClickable(true);). In questo modo puoi avere una lista con solo alcuni elementi che rispondono a longclick.

Spero che questo ti possa aiutare.

+21

Assicuratevi di chiamare "lv.setLongClickable (true);" anche. –

+14

Questo non ha funzionato per me. Ma questo: 'lv.setOnItemLongClickListener (nuovo AdapterView.OnItemLongClickListener() {...' –

+0

in qualche modo adroid: longClickable = "true" è l'impostazione predefinita. Sto usando l'API 19. Quindi non ho avuto bisogno di specificarlo – user1592714

5

Penso che questo codice di cui sopra lavorerà sulla LongClicking ListView, non le singole voci.

perché non utilizzare registerForContextMenu(listView). e quindi ottenere la richiamata in OnCreateContextMenu.

Per la maggior parte dei casi d'uso questo funzionerà allo stesso modo.

13

o provare questo codice:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

      public boolean onItemLongClick(AdapterView<?> arg0, View v, 
        int index, long arg3) { 

    Toast.makeText(list.this,myList.getItemAtPosition(index).toString(), Toast.LENGTH_LONG).show(); 
       return false; 
      } 
}); 
18

Se il vostro ListView fila voce si riferisce ad un file XML separato, assicurarsi di aggiungere android:longClickable="true" a tale file di layout oltre a impostare setOnItemLongClickListener() al vostro ListView.

+0

Grazie! Mi sono sbattuto la testa con questo. – Shaihi

0

questo dovrebbe funzionare

ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
              int pos, long id) { 
       // TODO Auto-generated method stub 

       Toast.makeText(getContext(), "long clicked, "+"pos: " + pos, Toast.LENGTH_LONG).show(); 

       return true; 
      } 
     }); 

anche non dimenticare di in xml android:longClickable="true" o se si dispone di una visualizzazione personalizzata aggiungere questo alla vostra abitudine vista della classe youCustomView.setLongClickable(true);

ecco l'output del codice sopra enter image description here

0

Ho provato la maggior parte di queste risposte e non funzionavano tutte con TextViews che aveva abilitato il collegamento automatico, ma dovevano anche usare la stampa lunga nello stesso posto!

Ho creato una classe personalizzata che funziona.

public class TextViewLinkLongPressUrl extends TextView { 

    private boolean isLongClick = false; 

    public TextViewLinkLongPressUrl(Context context) { 
     super(context); 
    } 

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void setText(CharSequence text, BufferType type) { 
     super.setText(text, type); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_UP && isLongClick) { 
      isLongClick = false; 
      return false; 
     } 

     if (event.getAction() == MotionEvent.ACTION_UP) { 
      isLongClick = false; 
     } 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      isLongClick = false; 
     } 

     return super.onTouchEvent(event); 
    } 

    @Override 
    public boolean performLongClick() { 
     isLongClick = true; 
     return super.performLongClick(); 
    } 
}