tuve esta situación últimamente al utilizar hiladores y el internet no me paré' t se le ocurrió una solución adecuada.
Mi escenario de aplicación:
spinners X (dinámicamente, 2 para cada CPU, min & max) para configurar & ver la CPU-frecuencia. Se llenan cuando se inicia la aplicación y también obtienen la frecuencia máxima/mínima actual del conjunto de CPU. Se ejecuta un hilo en el fondo y comprueba los cambios cada segundo y actualiza los giradores en consecuencia. Si el usuario establece una nueva frecuencia dentro de la ruleta, se establece una nueva frecuencia.
El problema era que el hilo accedía a setSelection para actualizar la frecuencia actual que a su vez llamaba a mi oyente y no tenía manera de saber si era el usuario o el hilo el que cambiaba el valor. Si era el hilo, no quería que se llamara al oyente, ya que no habría habido necesidad de cambiar la frecuencia.
me ocurrió una solución que se adapte a mis necesidades perfectamente y trabaja alrededor del oyente en su llamada :) (y creo que esta solución le da el máximo control)
extendí Spinner:
import android.content.Context;
import android.widget.Spinner;
public class MySpinner extends Spinner {
private boolean call_listener = true;
public MySpinner(Context context) {
super(context);
}
public boolean getCallListener() {
return call_listener;
}
public void setCallListener(boolean b) {
call_listener = b;
}
@Override
public void setSelection(int position, boolean lswitch) {
super.setSelection(position);
call_listener = lswitch;
}
}
y creado mi propia OnItemSelectedListener:
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
public class SpinnerOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
MySpinner spin = (MySpinner) parent.findViewById(parent.getId());
if (!spin.getCallListener()) {
Log.w("yourapptaghere", "Machine call!");
spin.setCallListener(true);
} else {
Log.w("yourapptaghere", "UserCall!");
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
Si ahora crear un MySpinner puede utilizar esto para establecer la selección:
setSelection(position, callListener);
Donde callListener es verdadero o falso. True llamará al oyente y es el predeterminado, por lo que las interacciones del usuario se identifican, falso también llamará al oyente pero utiliza el código que desea para este caso especial, ejempli gratia en mi caso: Nada.
espero que alguien encuentra este útil y está a salvo de un largo viaje para mirar si algo como esto ya existe :)
Esto funcionó para mí ajuste seleccionado con el ejecutable http://stackoverflow.com/a/13528576/1104279 – Gil