Stackview では、OnItemSelectedListener (スーパークラス "AdapterView" から) が呼び出されないようです...スタック上のビューがユーザーによって変更されたときにイベントをトリガーするにはどうすればよいですか?
スタック内の現在のアイテムの位置を示すテキストを表示したいので、ユーザーがスタックをブラウズしたときにテキストビューを更新する方法を見つける必要があります。
ありがとう、
パーティーには少し遅れましたが、グーグルからここに来る人々のために。幸いなことに、私はもっと簡単な解決策を見つけました。ただし、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の2番目のパラメーター)は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);
}
このスレッドは、彼が新しい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();
}
}
}
私はそれを少しテストしましたが、動作します..