У меня была такая ситуация в последнее время при использовании блесен, и интернет не нашел подходящего решения.
Сценарий моего приложения:
X счетчиков (динамически, 2 на каждый процессор, мин. И макс.) Для установки и просмотра частоты процессора. Они заполняются при запуске приложения и также получают текущую максимальную / минимальную частоту набора процессоров. Поток работает в фоновом режиме и каждую секунду проверяет наличие изменений и соответственно обновляет счетчики. Если пользователь устанавливает новую частоту внутри счетчика, устанавливается новая частота.
Проблема заключалась в том, что поток обращался к setSelection для обновления текущей частоты, которая, в свою очередь, вызывала моего слушателя, и у меня не было возможности узнать, изменил ли значение пользователь или поток. Если бы это был поток, я бы не хотел, чтобы слушатель вызывался, поскольку не было бы необходимости менять частоту.
Я придумал решение, которое идеально соответствует моим потребностям и работает вокруг слушателя по вашему вызову :) (и я думаю, что это решение дает вам максимальный контроль)
Я расширил 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;
}
}
и создал свой собственный 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
}
}
Если вы сейчас создаете MySpinner, вы можете использовать это, чтобы установить выбор:
setSelection(position, callListener);
Где callListener имеет значение true или false. True вызовет прослушиватель и используется по умолчанию, поэтому пользовательские взаимодействия будут идентифицированы, false также вызовет прослушиватель, но использует код, который вы хотите для этого особого случая, в качестве примера gratia в моем случае: ничего.
Я надеюсь, что кто-то еще найдет это полезным и избавится от долгого пути, чтобы посмотреть, если что-то подобное уже существует:)