2011-11-04 2 views
1

, 스택의 상단에있는 뷰가 이 변경 될 때 나는 몇 가지 이벤트를 트리거 할 수있는 방법 ... OnItemSelectedListener이 (슈퍼 클래스 "어댑터 뷰 AdapterView"에서) 호출되지 않습니다 보인다 사용자가?StackView 및 OnItemSelectedListener (안드로이드 3.0 이상)

스택에 현재 항목 의 위치를 ​​표시하는 텍스트를 표시하려고합니다. 사용자가 스택을 탐색 할 때 텍스트 뷰를 업데이트하는 방법을 찾아야합니다.

감사합니다, 나는 새로운 클래스 StackView을 확장하고 작동 OnItemSelected 논리를 얻기 위해 몇 가지 코드를 작성을 쓰고 무슨 짓을

답변

0

. onTouchEvent가 나에게 MotionEvent.getAction() == ACTION_UP을 주었을 때 StackView.getDisplayedChild()가 변경 될 때까지 자신을 호출하는 Thread를 시작합니다. 변경되면 OnItemSelected 논리를 시작하므로 항상 첫 번째 자식을 표시 할 수 있습니다. 자신이 그가 새로운 displayedChild를 가져 전까지

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

이 스레드주기 :

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

이 리스너 대신에 그들 모두를 해제 한 후 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(); 
     } 
    } 
} 

..

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()을 사용하면 불행히도 StackView 하위 클래스를 반환하기 때문에 작동하지 않습니다. 어쩌면 누군가가 그 해결책을 발견 할 것입니다.

관련 문제