2011-01-01 3 views
5

목표는 어댑터가 ListView를 리턴하는 갤러리를 구현하는 것입니다 (다시 말해, 수평 스크롤링 갤러리에 임베드 된 ListView를 수직으로 스크롤). 약간의 작업 후에는 일종의 작업이지만 수평으로 스크롤하려고하면 ListView가 매우 불안정 해 보입니다. 갤러리에 임베드 된 다른 유형의 뷰에서는 이러한 종류의 동작을 관찰하지 못했습니다. 여기 갤러리 내부에 ListView 포함하기

내가 시도 것입니다 : 처음

, I리스트 뷰는 터치 이벤트를 숙청 것을 발견, 그래서 갤러리에 제스처 리스너는 결코 해고됩니다. ListView에가 팽창하고 구성한 후, 갤러리 어댑터의 getView() 메소드 내에서, 그리고

galleryGestureDetector = new GestureDetector(this, gallery);

:

그래서 활동의에서 onCreate() 메소드에서, 나는 GestureDetector를 생성 나는 심지어 목록보기의 onTouchEvent() 메소드가 실제로 호출되지 않도록하기 위해 OnTouchListener에서 진정한 반환의 극단적 인 단계로 갈이 경우

listView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     galleryGestureDetector.onTouchEvent(event); 
     return true; 
    } 
}); 

: 좀과 같은 코드가 있습니다. 동일한 불안감이 발생합니다. 결과적으로, 나는 두 개의보기 사이에 경쟁하는 onTouchEvent() 구현을 배제 할 수 있다고 생각합니다.

갤러리의 터치 사각형을 확장하여 ListView를 포함시킨 다음 ListView에 위임하도록 강요했지만 TouchDelegate 개념을 남용했지만이 역시 쓸데없는 노력이었습니다.

나는 손을 포기하고 현재 가능하지 않다고 말하지만, DroidX로 포장 된 소셜 네트워킹 앱이 어떻게 든 그것을 완성합니다!

+0

갤러리가 렌더링 될 때마다 목록보기가보기를 많이 만들거나 팽창하지 않는지 확인해야 할 수도 있습니다. 문제가 있는지 확인하기 위해 캐싱을 시도해보십시오 (또는 정적 필드 하나만 사용). – monkjack

+0

좋은 생각 monkjack, 그리고 실제로, 그것이 선택에서 나간 후에 갤러리가 어댑터에서 반환 된 ListView를 재활용하고있는 것처럼 보입니다. 나는 당신이 제안한 것과 같은 견해를 캐쉬 해보려고 노력했는데,이 문제에 대한 솔루션을 테스트하기 위해 사용하고있는 3 가지 요소 중 3 가지 뷰 만 팽창 된 것을 확인했습니다. 불행히도, 나는 같은 결과를 보았습니다 ... 뷰가 미끄러지 듯 움직이면 미친 듯 떨리는 것입니다. – jkschneider

+0

더욱 신비 롭다 - 나는 ListView가 지 터링을 시작한 후 수평으로 계속해서 스크롤하려고 시도 할 때 갤러리가 때로는 두 뷰 사이에 끼어들 수도 있다는 것을 알았다. – jkschneider

답변

5

문제는 ListView가 갤러리의 터치 이벤트를 가로 채고 뷰 위치 자체를 변경한다는 것입니다. 이것은 위젯을 그대로 사용하면 앞뒤로 흔들리는 효과를 유발합니다. 나는이 갤러리 위젯에서이 문제를 고려하지만, 그 사이에이 같은 갤러리를 서브 클래스에 의해 고정 될 수있다 : 당신은 갤러리의 장소에서 BetterGallery를 사용하는 경우

public class BetterGallery extends Gallery { 
private boolean scrollingHorizontally = false; 

public BetterGallery(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public BetterGallery(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public BetterGallery(Context context) { 
    super(context); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    super.onInterceptTouchEvent(ev); 
    return scrollingHorizontally; 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
    scrollingHorizontally = true; 
    return super.onScroll(e1, e2, distanceX, distanceY); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch(event.getAction()) { 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_CANCEL: 
     scrollingHorizontally = false; 
    } 

    return super.onTouchEvent(event); 
} 

}

이 모든 것이 바로 작동 벌금!