2

부메랑 전자 메일 클라이언트가 얻은 구현 (또는 iOS 용 사서함)과 유사한 스 와이프 및 클릭 버튼을 허용하는 사용자 지정 목록보기를 구현하려고합니다.터치 이벤트를 사용하지 않고 listItem onClickListener 구현

목록 항목 자체를 클릭하려는 경우 새 OnItemClickListener를 만들고 터치 이벤트를 사용하지 않고 포커스 가능 또는 클릭 가능 하위 항목이 없는지 확인하고 사용자 지정 목록보기에서 스 와이프를 감지하도록 할 수 있습니다 . 그러나 목록 항목 내에서 항목을 클릭 할 수있게 만들면 OnItemClickListener를 호출하지 않고 터치 이벤트를 사용하고 사용자 지정 목록 자체의 스 와이프 기능을 사용하지 않도록 설정합니다.

onTouchListener의 사용자 지정 구현을 만들거나 사용자 지정보기 그룹에 onInterceptTouchEvent를 사용하려고했습니다. 이러한 모든 구현의 경우 onTouchListener는 Action.DOWN에서 true를 반환해야하므로 터치 이벤트를 사용합니다. 그렇지 않으면 터치 이벤트의 나머지 부분을 듣지 않습니다.

OnItemClickListener가 터치 이벤트를 사용하지 않고 터치를 감지 할 수있는 이유는 무엇입니까? 그리고 내 자신의 사용자 정의 구현을 위해이를 복제하는 방법은 무엇입니까? 어떤 도움이나 조언을 부탁드립니다!

Boomerang swipable and clickable list functionality

여기에 작동하고 터치 이벤트 소비하지 않는 OnItemClickListener입니다 : 여기

private AdapterView.OnItemClickListener onClick = new AdapterView.OnItemClickListener() 
    { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View v, int position, 
       long arg3) { 

      mAction = mAdapter.getItem(position); 
      updateListToShowCurrentAction(); 
      return; 
     } 
    }; 

내가 목록 항목 내에서보기를 구현할 수 있도록하고 싶습니다 기능의를 여전히 동안 터치 이벤트를 맞춤 목록보기로 전달합니다.

cancelButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
        final int position = mListView.getPositionForView((View) v.getParent()); 
        mReordCtrl.removeAction(mAdapter, position);   
      } 
     }); 

다음은 list_item의 레이아웃 스 니펫입니다.

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:tag="list_item" > 

    <LinearLayout 
      android:id="@+id/back" 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent" 
      android:layout_gravity="center_vertical" 
      android:orientation="horizontal" 
      android:tag="back" > 

      <ImageView 
       android:id="@+id/cancel_button" 
       android:layout_width="0dp" 
       android:layout_height="fill_parent" 
       android:layout_weight="1" 
       android:src="@drawable/ic_action_cancel" 
       android:tag="cancel_button" /> 
      </LinearLayout> 

답변

5

onInterceptTouchEvent로 이미 놀았 으면 onTouchEvent (MotionEvent e)를 재정 의하여보십시오. 다음은 SimpleOnGestureListener 감지기와 부모 클래스에 대한 콜백에 사용할 수있는 사용자 정의 인터페이스 viewListener를 통합하여 필요에 맞게 구현할 수있는 구현 예입니다. 클릭 수를 감지하고 싶다면 아마이 모든 것을 필요로하지 않을 것입니다. 제스처 감지기로 벗어날 수 있습니다. 또한 link 터치 이벤트 처리를 연구 할 때 도움이된다고합니다.

@Override public boolean onTouchEvent(MotionEvent ev) { 
    //See if the gesture detector has detected an event. 
    boolean eventConsumed = detector.onTouchEvent(ev); 
    if (!eventConsumed) { 

     //If no gesture detected, and the motion is finished, do something 
     if (ev.getAction() == MotionEvent.ACTION_UP) { 
      //DO SOMETHING, such as scroll 

      //Send event to listener. 
      if (viewListener != null) { 
       this.viewListener.onUp(ev.getX()); 
      } 
      return true; //Consume the event, so nothing else fires. 
     } else { 
      //If no event is detected, and the action hasn't finished, do the default behavior 
      return super.onTouchEvent(ev); 
     } 
    } else { 
     return true; //Consume the event, so nothing else fires. You can change this to false if you'd like to not consume the event. 
    } 

} 

및 다운 스 와이프를 캡처하지만 다른 모든 제스처를 자식에게 전달하는 사용자 정의 세로 스크롤보기 클래스입니다.

public class VerticalScrollView extends ScrollView { 
private GestureDetector mGestureDetector; 
View.OnTouchListener mGestureListener; 

public VerticalScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mGestureDetector = new GestureDetector(context, new YScrollDetector()); 
    setFadingEdgeLength(0); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    boolean superBool = super.onInterceptTouchEvent(ev); 
    boolean intercept = mGestureDetector.onTouchEvent(ev); 
    return superBool && intercept ; 
} 

// Return false if we're scrolling more in the x direction than in the y direction, so we don't claim the action. 
class YScrollDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     return Math.abs(distanceY) > Math.abs(distanceX); 
    } 
} 

}

+0

나는 지금까지 내가 말할 수있는 유일한 방법은 제스처의 전체를 얻을 수 있기 때문에 내가 Action.DOWN이 때문에 소비에 true를 돌려 위해 뭔가를 실종 해요 확신 터치 또는 스 와이프 여부를 알기 전에 모션 이벤트의 나머지 부분을 확인하십시오. 아이디어는 목록보기에서 스 와이프를 구현하고 list_item보기에 닿아 야하지만 길어질수록이 기능은 터치 이벤트를 소비하는 방식을 구현하는 안드로이드 방식 때문에 가능하지 않다고 생각합니다. –

+0

완전히 가능합니다. 클릭 가능한 항목 (보기 및 단추)과 클릭 및 가로 스 와이프를 모두 지원하는 사용자 지정 슬라이드 쇼 클래스가 포함 된 최상위 세로 스크롤보기로 구성된 활동이 있습니다. 작동 시키려면 약간의 놀음이 필요했습니다. 스크롤 뷰를 서브 클래 싱하고 onScroll GestureDetector를 사용하여 onInterceptTouchEvent를 오버로드하여 수직 스크롤링을 캡처했습니다.다른 모든 이벤트는 하위 항목에 의해 처리되며 위 코드는 사용자 정의 슬라이드 쇼 클래스의 일부입니다. 내 대답에 수직 스크롤보기 코드를 추가하여 도움이되기를 바랍니다. – GLee

+0

도움을 많이 주셔서 감사합니다! 귀하의 조언을 따르고 모든 비 - 클릭 터치 이벤트를 사용자 정의 상위보기로 처리하도록했습니다. 여전히 사용중인 라이브러리와 동일한 기능을 사용하기 위해 노력하고 있지만 지금은 올바른 방향으로 가고 있다고 생각합니다. –

관련 문제