2010-04-28 20 views
7

? Estoy tratando de hacer que el Spinner se comporte de manera diferente cuando el usuario hace clic en un elemento durante mucho tiempo. Tengo un spinner con un proyecto y quiero dos cosas.¿Cómo puedo usar spinner setOnItemLongClickListener

  1. Cuando el usuario simplemente haga clic en un elemento que quiero normal, selecciónelo.
  2. Cuando el usuario ha hecho clic largo en un elemento que quiero mostrar diálogo, con opciones como "Editar elemento", "Eliminar elemento".

El primer paso funciona bien (por supuesto), pero cuando estoy tratando de hacer la segunda tarea no puedo hacer spinner para generar evento longClicked.

Aquí está mi código:

this.projectSpinner = (Spinner) this.findViewById(R.id.SpinnerProjects); 
    this.projectSpinner.setLongClickable(true); 

    this.projectSpinner.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ 
     public boolean onItemLongClick(AdapterView<?> arg0, 
             View arg1, 
             int arg2, 
             long arg3) { 
      Toast.makeText(
       AndroidTimeTrackerMainActivity.this, 
       "Long click", 
       Toast.LENGTH_SHORT).show(); // This toast doesn't show up. 
      return false; 
     } 

    }); 

Respuesta

15

El Spinner actualmente no soporta OnItemLongClickListener.

+0

Aquí está el [enlace de documentación] (http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener%28android.widget.AdapterView.OnItemClickListener%29). – MaxChinni

8

Sin embargo, puede agregar un OnLongClickListener al Spinner. No se disparará cuando un elemento del menú hace clic largo, pero se disparará cuando el usuario haga clic en el spinner.

this.projectSpinner.setOnLongClickListener(new OnLongClickListener() 
{ 
    @Override 
    public boolean onLongClick(View v) 
    { 
     System.out.println(chuteSpinner.getSelectedItem().toString() + " is long clicked"); 
     return true; 
    } 
}); 
1

1) Crear una clase personalizada por spinner spinner se extiende,

public class CCSpinner extends Spinner { 
    public CCSpinner(Context context) { 
     super(context); 
    } 

    public CCSpinner(Context context, int mode) { 
     super(context, mode); 
    } 

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

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

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

    @Override 
    public void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
    } 
} 

utilizar el controlador anterior en su vista XML.

2) Definir una interfaz para manejar clics,

public interface ClickListener { 
     void onItemLongClicked(View view); 
     void onItemClicked(View view); 
    } 

3) En su clase adaptador spinner hacer estos productos alimenticios en getView y getDropDownView

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //ususal stuffs 
     convertView.setTag(R.string.click_tag, position); 
     convertView.setClickable(false); 
     convertView.setLongClickable(false); 



     return convertView; 
    } 


    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     //ususal stuffs 
     convertView.setTag(R.string.click_tag, position); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (clickListener != null) { 
        clickListener.onItemClicked(v); 
       } 
      } 
     }); 


     convertView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       if (clickListener != null) { 
        clickListener.onItemLongClicked(v); 
       } 
       return true; 
      } 
     }); 

     return convertView; 
    } 

4) al crear la instancia del adaptador, pase el Interfaz ClcikListener que creamos.

5) y en la clase que implementa lo siguiente,

@Override 
    public void onItemLongClicked(final View view) { 
     mPSpinner.onDetachedFromWindow(); 
     final int pos = (int) view.getTag(R.string.click); 
     mPSpinner.setSelection(pos); 
    } 


    @Override 
    public void onItemClicked(final View view) { 
     mPSpinner.onDetachedFromWindow(); 
     int pos = (int) view.getTag(R.string.click); 
     mPSpinner.setSelection(pos); 
    } 
+1

Funcionó como un encanto. Agregué un parámetro de "posición int" a los métodos de interfaz para determinar qué elemento hace clic largo. –

0

simplemente utilizar un controlador con touchlistener. para obtener el elemento seleccionado spinner.getSelectedItemPosition