2013-08-12 4 views
0

나는 OnItemClickListener와 OnItemLongClickListener를 가진리스트 뷰를 가지고있다.android listview : longclicklistener를 사용한 셀 전환 드로어 블

내 listadapter의 getView 메소드에서 배경으로 TransitionDrawable을 사용하여 뷰를 설정 한 다음, OnTouchListener를 뷰에 적용하여 사용자가 뷰를 누르고 그 상태를 유지하면 전환이 발생하는 것을 볼 수 있습니다.

문제는 OnTouchListener가 true를 반환해야한다는 것입니다. 그렇지 않으면 ACTION_DOWN motionevent 만 캡처됩니다. 그러나 true를 반환하면 내 OnItemClickListener 및 OnItemLongClickListener가 시작되지 않습니다.

질문은 어떻게 둘 다 TransitionDrawable의 애니메이션을 표시하고 클릭 이벤트를 발생시킬 수 있습니까? ArrayAdapter와의

의 getView (..) :

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ... 

    convertView.setOnTouchListener(touchListener); 
    return convertView; 
} 

OnTouchLIstener :

OnTouchListener touchListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) {   
     TransitionDrawable transition = (TransitionDrawable)v.getBackground(); 

     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      transition.startTransition(ViewConfiguration.getLongPressTimeout()); 
      return true; 
     } 
     else { 
      transition.resetTransition(); 
     } 

     return false; 
    } 
}; 

답변

0

내가 클릭을위한 인터페이스를 생성하고 자신을 longclick와 onTouchListener에서 그들을 취급 결국 :

private class TransitionView implements OnTouchListener { 
    private Object object; 
    TransitionDrawable transition; 
    CountDownTimer timer; 
    boolean running; 
    View v; 

    public TransitionView(Object object) { 
     this.object = object; 

     int time = ViewConfiguration.getLongPressTimeout(); 
     timer = new CountDownTimer(time, time) { 

      @Override 
      public void onTick(long millisUntilFinished) { } 

      @Override 
      public void onFinish() { 
       running = false; 
       transition.resetTransition(); 
       longClickListener.onItemLongClick(TransitionView.this.object, v); 
      } 
     }; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     this.v = v; 

     transition = (TransitionDrawable)v.getBackground(); 

     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      transition.startTransition(ViewConfiguration.getLongPressTimeout()); 
      timer.start(); 
      running = true; 
      return true; 
     } 
     else if(event.getAction() == MotionEvent.ACTION_UP) { 
      if(running) { 
       timer.cancel(); 
       running = false; 
       itemClickListener.onListItemClick(object, v); 
      } 
      transition.resetTransition(); 
     } 
     else if(event.getAction() == MotionEvent.ACTION_CANCEL) { 
      transition.resetTransition(); 
     } 

     return false; 
    } 
}