android: GridView onFling / on ItemClickListener 미끄럼 과 클릭 이벤트 충돌

View Flipper 를 사용 할 때, 안 에는 두 개의 GridView 가 있 고, GridView 안의 item 마다 하나의 클릭 이벤트 가 있 습 니 다.
잘 처리 되 지 않 으 면 GridView 의 onFling 에서 그의 item 을 클릭 하면 item 위의 onClick 이 벤트 를 동시에 실행 합 니 다.
하지만 이 럴 때 우리 가 원 하 는 것 은 미끄럼 으로 다른 GridView 를 표시 하 는 것 일 뿐 입 니 다. 다음은 해결 방법 입 니 다.
자신의 Gesture Listener, please refer to 를 쓰 세 요. http://stackoverflow.com/questions/4184382/how-to-implement-both-ontouch-and-also-onfling-in-a-same-listview
public class MYGestureListener extends SimpleOnGestureListener implements
		OnTouchListener {
	
	private GestureDetector gDetector;
	private ViewFlipper viewFlipper;
	
	public MYGestureListener(){
		super();
	}
	
	public MYGestureListener(Context con){
		this(con, null, null);
	}
	public MYGestureListener(Context con, GestureDetector gDetector, ViewFlipper viewFlipper){
		if(null == gDetector){
			gDetector = new GestureDetector(con, this);
		};
		
		this.gDetector = gDetector;
		this.viewFlipper = viewFlipper;
	}
	
	@Override
	public boolean onSingleTapConfirmed(MotionEvent e) {
		return super.onSingleTapConfirmed(e);
	}
	
	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		//TODO viewFlipper.showNext()...whatever you want
		return false;
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		return gDetector.onTouchEvent(event);
	}
	
	public GestureDetector getDector(){
		return this.gDetector;
	}

}

MyActivity.java
public class MyActivity extends Activity{

	private Context appCon;
	private ViewFlipper viewFlipper;
	private MTCGestureListener gestureListener;
	private GridView page1Grid;
	private GridView page2Grid;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        appCon = this;
        initView();
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    	//This is the important part
    	return gestureListener.getDector().onTouchEvent(event);
    }
    
    private void initView(){
    	viewFlipper = (ViewFlipper)findViewById(R.id.viewFlipper);
    	page1Grid = (GridView)findViewById(R.id.iconList1);
    	page2Grid = (GridView)findViewById(R.id.iconList2);

    	SimpleAdapter adapter1 = new SimpleAdapter(this, fillMap1(),
    				R.layout.function_item,
    				new String[]{"fnImg","fnTitle"},
    				new int[]{R.id.fnImg, R.id.fnTitle});
    	page1Grid.setAdapter(adapter1);
    	SimpleAdapter adapter2 = new SimpleAdapter(this, fillMap2(),
				R.layout.function_item,
				new String[]{"fnImg","fnTitle"},
				new int[]{R.id.fnImg, R.id.fnTitle});
    	page2Grid.setAdapter(adapter2);
    	
    	initListener();
    }
    
    private void initListener(){
    	gestureListener = new MTCGestureListener(appCon, null, viewFlipper);
    	
		page1Grid.setOnTouchListener(gestureListener);
		page2Grid.setOnTouchListener(gestureListener);
		page1Grid.setOnItemClickListener(listener1);
		page2Grid.setOnItemClickListener(listener2);
    }
    
    private OnItemClickListener listener1 = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			//TODO whatever you want
		}
	};
	private OnItemClickListener listener2 = new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			//TODO whatever you want
		}
		
	};
}

좋은 웹페이지 즐겨찾기