2012-09-21 37 views
16

Utilizo el control de giro desplegable con el adaptador de cursor. Contiene, por ejemplo, 1 - 100 artículos. Selecciono p. elemento 50. Elemento seleccionado. La próxima vez, cuando abra la hilera, la primera hilera visible es el artículo 50. ¿Cómo puedo lograr eso cuando abro la hilera, se enfocará en el primer artículo/el primer elemento visible será el ítem 1?Spinner: enfoque en el primer elemento

Me refiero a autoscroll en la lista, por lo que el primer elemento visible en el menú desplegable es el primero y no el seleccionado.

Respuesta

31

Puede hacer que el Spinner hacer lo que quiera, extendiéndolo y sustituyendo los dos métodos que son responsables de la configuración/muestra la lista de valores:

public class CustomSpinnerSelection extends Spinner { 

    private boolean mToggleFlag = true; 

    public CustomSpinnerSelection(Context context, AttributeSet attrs, 
      int defStyle, int mode) { 
     super(context, attrs, defStyle, mode); 
    } 

    public CustomSpinnerSelection(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
    } 

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

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

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

    @Override 
    public int getSelectedItemPosition() { 
     // this toggle is required because this method will get called in other 
     // places too, the most important being called for the 
     // OnItemSelectedListener 
     if (!mToggleFlag) { 
      return 0; // get us to the first element 
     } 
     return super.getSelectedItemPosition(); 
    } 

    @Override 
    public boolean performClick() { 
     // this method shows the list of elements from which to select one. 
     // we have to make the getSelectedItemPosition to return 0 so you can 
     // fool the Spinner and let it think that the selected item is the first 
     // element 
     mToggleFlag = false; 
     boolean result = super.performClick(); 
     mToggleFlag = true; 
     return result; 
    } 

} 

Debería funcionar bien para lo quieres hacer.

+2

¡Excelente respuesta! ¡Gracias! – vandzi

+1

He estado buscando algo como esto ... ¡3 años después y sigue siendo una buena información! Gracias amigo. – BinaryShrub

+0

¡Tan genial !. Muchas gracias! – sonnv1368

2

Puede configurar la selección de un Spinner al primer elemento de esta manera:

yourspinner.setSelection(0); 

Es posible que desee hacer esto en el método onStart().

+4

Seleccione este primer elemento. No quiero seleccionar el primer artículo. Solo despliega en spinner hasta el primer elemento, para que pueda ver el primer elemento en la lista desplegable. – vandzi

1

Este código corto hará el trabajo por usted.

int prevSelection=0; 
    spSunFrom = (Spinner) findViewById(R.id.spTimeFromSun); 
    spSunFrom.setOnTouchListener(new OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      prevSelection = spSunFrom.getSelectedItemPosition(); 
      spSunFrom.setSelection(0); 
      return false; 
     } 
    }); 
    spSunFrom.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 
      if(arg2==0) 
       spSunFrom.setSelection(prevSelection); 
      prevSelection = arg2; 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      spSunFrom.setSelection(prevSelection); 
     } 
    }); 
+1

Bonito código, pero no es exactamente lo que busco. No quiero seleccionar el primer artículo. Solo quiero desplazarme hacia arriba al primer elemento. Entonces, cuando abras spinner, verás el primer ítem en la parte superior – vandzi

+0

Sí, pero para mostrar el primer ítem ... hay la única forma en que encontré :) – MKJParekh

+0

No sé cuál es la magia que necesito hacer, pero funciona esto manera en la aplicación de Android Gmail. Si tiene en la navegación más elementos visibles en la pantalla (por ejemplo, en modo horizontal) cada vez que abre la rueda giratoria, le mostrará el primer elemento en la parte superior – vandzi

Cuestiones relacionadas