리스트뷰 안에서 혹은 헤더에 넣어둔 이미지뷰나 버튼에 온터치를 줘야 한다면
기본 리스트뷰로는 온터치에서 세로로 터치가 이루어지면 리스트뷰가
인터셉터를 하기때문에 온터치를 처리 할 수 없습니다.

리스트뷰 안에 온터치를 컨트롤 하기 위해서는 Custom listview 를 사용 해야 합니다.
listview 를 상속 받아 사용 해야 하는데 클레스를 하나 생성후 extend listview 해서
만들어 주면 됩니다.

아래 소스는 제가 임의로 onIntercepttouch를 컨트롤 하기 위해 만들었습니다.
TouchCheck 변수를 통해서 컨트롤를 하는데요 리스트뷰 안에 다른 뷰가
온터치가 발생 하게 되면 TouchCheck 를 false 로 바꿔주면서 리스트뷰가
인터셉터를 하는걸 막게 되는겁니다.
TouchCheck 변수를 변경하기 위하여 setTouch 라는 메소드를 임의로 생성 하였습니다.

사용 방법은
아래처럼 메인 클레스에서 생성 합니다.
CustomListview lsitview = (CustomListview )findViewById(R.id.list);
생성 후
lsitview.setTouch() 로 컨트롤 하게 됩니다.
아래에서 img 는 listivew 안에 온터치를 처리하게될 다른 뷰라고 생각하시면 됩니다.


  ImageView img = new ImageView(this);
        img.setOnTouchListener(m_onTouchListener);

    OnTouchListener m_onTouchListener = new OnTouchListener(){

        @Override
        public boolean onTouch(View p_v, MotionEvent p_event){
            
            switch (p_event.getAction()){
            case MotionEvent.ACTION_DOWN:{
                lsitview .setTouch(false); // 온터치가 이루어질때 false 로 바꿔준다.
                
            }
            case MotionEvent.ACTION_UP:{
                lsitview .setTouch(true); // 온터치에서 손을 땐경우 true 로 바꿔준다
                break;
            }

            case MotionEvent.ACTION_MOVE:{
                 //드레그 할때 처리
                break;
            }
            }
            return true;
        }
    };


public class CustomListview extends ListView {

    private boolean TouchCheck = true;
    
    public CustomListview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    
        if ( TouchCheck == false){
            super.onInterceptTouchEvent(ev);
            return false;
        }
        return super.onInterceptTouchEvent(ev);
    }
        
    public void setTouch(boolean check){
        TouchCheck = check ;
    }
            
}


+ Recent posts