Android/View

ListView 내에 ScrollView가 있을 때, 스크롤 분기하는 방법

덩치 2016. 3. 7. 17:04



ListView Adapter 내부 getView 메소드에서 아래와 같은 방식 적용


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

.

.

.

HorizontalScrollView mScrollView = (HorizontalScrollView) convertView.findViewById(R.id.rf_horizon_scroll);

mScrollView.setOnTouchListener(new ScrollViewOnTouchListener(mScrollView, position));

.

.


}


private class ScrollViewOnTouchListener   implements View.OnTouchListener {

        HorizontalScrollView view;

        float historicX = Float.NaN;

        static final int DELTA_ON_CLICK = 30; // 이동 허용 범위

        long historicTime;

        int position;

        public ScrollViewOnTouchListener(HorizontalScrollView view, int position){

            this.view = view;

            this.position = position;

        }


        @Override

        public boolean onTouch(View v, MotionEvent event)

        {

            switch (event.getAction())

            {

                case MotionEvent.ACTION_DOWN:

    v.setBackgroundColor(Color.parseColor("#D5D5D5"));    // 터치된 리스트 아이템 색상 변경을 위한 코드

                    historicX = event.getX();

                    historicTime = System.currentTimeMillis();

                    break;


                case MotionEvent.ACTION_UP:

                    if (Math.abs(event.getX() - historicX) < DELTA_ON_CLICK) {

  // 아이템 터치시 작업할 내용

                    }

                    break;

                case MotionEvent.ACTION_CANCEL:

                    v.setBackgroundColor(Color.parseColor("#00000000"));   // UP or CANCEL 이벤트 발생 시 아이템 배경색 원상복구

                    break;

                default: return false;

            }

            return true;

        }

    }


설명 : 리스트뷰 내부에 스크롤뷰 영역은 리스트뷰의 아이템 터치이벤트가 발생하지 않는다.

          때문에 스크롤뷰에 클릭 리스너를 등록하여 최초 터지 지점(DOWN) 부터 UP 까지의 픽셀이 짧은 경우 스크롤링이 아닌

          단순 터치로 판단하고 그에 따른 이벤트를 실행하는 방법이다.

          경우에 따라 시간 필터를 추가로 적용 가능하다.