StackView и OnItemSelectedListener (Android 3.0+) - PullRequest
1 голос
/ 04 ноября 2011

В Stackview кажется, что OnItemSelectedListener (из суперкласса "AdapterView") никогда не вызывается ... Как я могу вызвать какое-то событие, когда вид сверху стека изменено пользователем?

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

Спасибо

Ответы [ 2 ]

1 голос
/ 11 октября 2012

Немного опоздал на вечеринку, но для людей, пришедших сюда из Google. К счастью, я нашел более простое решение. Это все еще включает в себя расширение StackView.

import android.content.Context;
import android.util.AttributeSet;
import android.widget.StackView;

public class StackViewAdv extends StackView
{
    public StackViewAdv(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public StackViewAdv(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setDisplayedChild(int whichChild)
    {
        this.getOnItemSelectedListener().onItemSelected(this, null, whichChild, -1);

        super.setDisplayedChild(whichChild);
    }
}

Обратите внимание, что это решение только дает индекс выбранного представления слушателю, и представление (второй параметр onItemSelected) равно null !

Использование this.getCurrentView() вместо null, к сожалению, не работает, поскольку возвращает подкласс StackView. Может быть, кто-то найдет решение для этого.

0 голосов
/ 15 февраля 2012

То, что я сделал, - это написание нового класса, расширяющего StackView, и написание некоторого кода для работы логики OnItemSelected. Когда onTouchEvent дает мне MotionEvent.getAction () == ACTION_UP, я запускаю поток, который вызывает сам себя, пока не изменится StackView.getDisplayedChild (). Когда он меняется, я запускаю логику OnItemSelected, так что я всегда могу получить первого отображаемого потомка.

public boolean onTouchEvent(MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_UP && this.getAdapter() != null) {
        mPreviousSelection = this.getDisplayedChild();
        post(mSelectingThread);
    }
    return super.onTouchEvent(motionEvent);
}

Этот поток зацикливается, пока не получит нового displayChild:

private class SelectingThread implements Runnable {
    CustomStackView mStackView;

    public SelectingThread(CustomStackView stackView) {
        this.mStackView = stackView;
    }

    @Override
    public void run() {
        if(mStackView.getAdapter() != null) {
            if (mPreviousSelection == CustomStackView.this.getDisplayedChild()) {
                mThisOnItemSelectedListener.onItemSelected(mStackView, mStackView.getAdapter().getView(mPreviousSelection, null, mStackView),
                    mStackView.mPreviousSelection, mStackView.getAdapter().getItemId(mPreviousSelection));
                return;
            } else {
                mPreviousSelection = mStackView.getDisplayedChild();
                mStackView.post(this);
            }
        }
    }
}

Этот слушатель вместо этого устанавливает флажок Selected в true после отмены выбора их всех.

private class StackViewOnItemSelectedListener implements OnItemSelectedListener {

    CustomStackView mStackView;

    public StackViewOnItemSelectedListener(CustomStackView stackView) {
        this.mStackView = stackView;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View selectedView, int position, long id) {
        deselectAll();
        if (mStackView.getAdapter() != null) {
            if (mOnItemSelectedListener != null) {
                mStackView.mOnItemSelectedListener.onItemSelected(parent, selectedView, position, id);
            }
            mStackView.getAdapter().getView(position, null, mStackView).setSelected(true);
        }
    }

    private void deselectAll() {
        if (mStackView.getAdapter() != null) {
            int adapterSize = mStackView.getAdapter().getCount();
            for (int i = 0; i < adapterSize; i++) {
                mStackView.getAdapter().getView(i, null, mStackView).setSelected(false);
            }
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        if (mStackView.getAdapter() != null) {
            if (mOnItemSelectedListener != null) {
                mStackView.mOnItemSelectedListener.onNothingSelected(parent);
            }
            deselectAll();
        }
    }
}

Я немного проверил, и это работает ..

...