1

在 Stackview 中,似乎永远不会调用 OnItemSelectedListener (来自超类“AdapterView”)......当用户更改堆栈顶部的视图时,如何触发某些事件?

我想显示一些文本来显示当前项目在堆栈中的位置,所以我需要找到一种方法来在用户浏览堆栈时更新 textview。

谢谢,

4

2 回答 2

1

派对有点晚了,但对于从谷歌来这里的人来说。幸运的是,我找到了一个更简单的解决方案。它仍然涉及扩展 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 的子类。也许有人找到了解决方案。

于 2012-10-11T16:43:20.293 回答
0

我所做的是编写一个扩展 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);
}

这个线程循环自己,直到他得到新的displayedChild:

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

我已经对其进行了一些测试,并且可以正常工作..

于 2012-02-15T16:57:56.503 回答