티스토리 뷰

안녕하세요 박스여우입니다.

이번에는 ScrollView의 스크롤이 바닥에 닿았을때, 스크롤 뷰의 내용이 모두 보여졌을때 새로운 게시글을 로드하기 위한 이벤트를 발생시키는 방법에 대해 소개해 드리고자 합니다.



ScrollView 바닥에 닿았을 때 이벤트

여러가지 방법이 있지만 저는 Custom ScrollView를 만드는 방법으로 해결하였습니다.


핵심코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    private void checkIsLocatedAtFooter() {
 
        if (rect == null) {
            rect = new Rect(); //사각형을 그려주는 Rect 클래스 - 현재 보이는 화면의 사각형
            getLocalVisibleRect(rect); //현재 view의 절대 위치를 rect에 적용
            return;
        }
 
        int oldBottom = rect.bottom;  //지난번에 봤던 View의 바닥
        getLocalVisibleRect(rect);  //현재 보여지고 있는 View의 바닥
        int height = getMeasuredHeight();  //해당 ScrollView가 가지고 있는 높이
        View v = getChildAt(0);
        if (oldBottom > 0 && height > 0) { //View에 내용이 있을 경우
            if (oldBottom != rect.bottom && rect.bottom == v.getMeasuredHeight()) { //스크롤이 움직였을 때 && 보여지고 있는 바닥이 ScrollView의 바닥에 
                //바닥에 닿았을 때
            }
        }
    }
cs



전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class EndEventScrollView extends ScrollView {
    private Handler handler = null;
    private Rect rect;
 
    public EndEventScrollView(Context context, AttributeSet attrs) {
 
        super(context, attrs);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        checkIsLocatedAtFooter();
    }
 
    private void checkIsLocatedAtFooter() {
        if (rect == null) {
            rect = new Rect();
            getLocalVisibleRect(rect);
            return;
        }
        int oldBottom = rect.bottom;
        getLocalVisibleRect(rect);
        int height = getMeasuredHeight();
        View v = getChildAt(0);
        if (oldBottom > 0 && height > 0) {
            if (oldBottom != rect.bottom && rect.bottom == v.getMeasuredHeight()) {
                if (handler != null) {
                    handler.sendEmptyMessage(/*메세지*/);
                }
            }
        }
    }
 
    public void setHandler(Handler handler) {
        this.handler = handler;
    }
}
cs


댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함