Spinner - фокус на первом элементе

Я использую выпадающий счетчик с адаптером курсора. Он содержит, например, 1 - 100 элементов. Я выбираю, например. пункт 50. Пункт выбран. В следующий раз, когда я открою счетчик, первой видимой строкой будет элемент 50. Как я могу добиться того, чтобы при открытии счетчика он сосредоточился на первом элементе/первым видимым элементом был элемент 1?

Я имею в виду автоматическую прокрутку вверх в списке, поэтому первый видимый элемент в раскрывающемся списке является первым, а не выбранным.


person Martin Vandzura    schedule 21.09.2012    source источник


Ответы (3)


Вы можете заставить Spinner делать то, что хотите, расширив его и переопределив два метода, которые отвечают за настройку/отображение списка значений:

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;
    }

}

Он должен отлично работать для того, что вы хотите сделать.

person user    schedule 27.09.2012
comment
Я искал что-то подобное ... 3 года спустя, и это все еще хорошая информация! Спасибо, приятель. - person BinaryShrub; 28.11.2015
comment
Так здорово!. Большое спасибо! - person sonnv1368; 19.11.2017

Вы можете установить выбор счетчика на первый элемент следующим образом:

yourspinner.setSelection(0);

Возможно, вы захотите сделать это в методе onStart().

person Yellos    schedule 21.09.2012
comment
Это выбор первого элемента. Я не хочу выбирать первый элемент. Прокрутите счетчик только до первого элемента, чтобы я мог видеть первый элемент в раскрывающемся списке. - person Martin Vandzura; 21.09.2012

Этот короткий код сделает всю работу за вас.

    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);
        }
    });
person MKJParekh    schedule 21.09.2012
comment
Хороший код, но не совсем то, что я ищу. Я не хочу выбирать первый элемент. Я просто хочу прокрутить до первого элемента. Итак, когда вы откроете счетчик, вы увидите первый элемент сверху. - person Martin Vandzura; 21.09.2012
comment
Да, но показать первый элемент... это единственный способ, который я нашел :) - person MKJParekh; 21.09.2012
comment
Я не знаю, какое волшебство мне нужно сделать, но это работает так в приложении Android Gmail. Если у вас есть в навигации больше элементов, которые видны на экране (например, в ландшафтном режиме), каждый раз, когда вы открываете счетчик, он будет показывать вам первый элемент вверху. - person Martin Vandzura; 21.09.2012