OnItemSelectedListener Spinner Воссоздание цикла - Android - PullRequest
0 голосов
/ 26 июня 2019

У меня есть счетчик, и когда элемент выбран, я хочу восстановить действие.Но когда действие воссоздается, оно постоянно воссоздается, потому что запускается новый itemSelectedListener.Я исправил ошибку, но мне интересно, почему это происходит.Заранее спасибо за любые идеи, которые вы предлагаете.

    sp_lang.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               recreate();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

1 Ответ

1 голос
/ 26 июня 2019

Вы можете избежать первого события с флагом в OnItemSelectedListener.

sp_lang.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        Boolean firstEventConsumed = false;

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               if (firstEventConsumed) {
                   recreate();
               } else {
                   firstEventConsumed = true;
               }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

РЕДАКТИРОВАТЬ

Я нашел решение, но это всего лишь обходной путь.Это не окончательное решение.

Это странное поведение, когда вы воссоздаете действие.Когда действие создается в первый раз, оно не вызывает дважды onItemSelected, но при повторном создании оно вызывается дважды.

То, что я сделал ниже, - это контроль, когда выбран элементпользователем (обработка события касания) и когда это выполняется действием.

public class MainActivity extends AppCompatActivity {

    private Boolean isUserAction = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        // get the spinner
        // create the adapter
        spinner.setAdapter(spinnerAdapter);
        spinner.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                isUserAction = true;
                return false;
            }
        });
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (isUserAction) {
                    recreate();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // do nothing
            }
        });
    }
}
...