在 Stackview 中,似乎永远不会调用 OnItemSelectedListener (来自超类“AdapterView”)......当用户更改堆栈顶部的视图时,如何触发某些事件?
我想显示一些文本来显示当前项目在堆栈中的位置,所以我需要找到一种方法来在用户浏览堆栈时更新 textview。
谢谢,
派对有点晚了,但对于从谷歌来这里的人来说。幸运的是,我找到了一个更简单的解决方案。它仍然涉及扩展 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 的子类。也许有人找到了解决方案。
我所做的是编写一个扩展 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();
}
}
}
我已经对其进行了一些测试,并且可以正常工作..