마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰 자동 스크롤 문제

0 추천

안녕하세요 .. 구글링 이틀동안 해보다가 답이 안나와서 염치불구하고 ㅠㅠ..

 

리스트뷰에 어떤 버튼을 누르면 자동으로 스크롤하게끔 하고 싶어서요.

제가 지금 한 방법은 

[1]

버튼을 누른다-> 스레드 실행 ->핸들러에 listview.scrollTo() 메소드 넣어서 그걸로 내림

이렇게 했는데요.

이렇게 하니까 부드럽게 화면이 내려가는 것 까지는 좋은데 

listview가 새로운 뷰를 만들어 내지 않았습니다. (밑쪽이 텅 비어버립니다.)

 

로그를 찍어보니 getView 메소드가 실행이 되지 않았습니다 ㅠㅠ..

 

그리고 이렇게 하니 리스트뷰의 onScrollListener에서 listview.getY()를 하니 제대로 받아오지 못하더군요 ;;

 

다른분께 여쭤보니 어댑터 notifyDatasetChanged()를 제때제때 불러야 될 것 같다고 하셨는데..

제가 초보라서 어떻게 해야 하는지 감이 안옵니다..ㅜㅜ

핸들러 안에 넣어놓으니 당연히 렉이 걸리고.. 스크롤 할 때마다 갱신하려고 하면 슈퍼 렉(당연한 거지만요 ㅠㅠ)

 

혹시 제가 잘못한 부분 있는지.. 스레드 쪽 소스 올려봅니다 ㅠㅠ..

테스트 할 때는 텍스트뷰로 해서 몰랐는데 리스트뷰는 ㅠㅠ;

                        mThread = new Thread(new Runnable() {
                            public void run() {
                                try{
                                    while(true) {
                                        if(mThread.isInterrupted()) {
                                            mThread.interrupt();
                                        }
                                        y+=currentspeed;
                                        if(y!=lv.getBottom()){
                                            handler.sendMessage(handler.obtainMessage());
                                            Thread.sleep(40);
                                        }else{
                                            Thread.currentThread().interrupt();
                                        }
                                    }
                                }catch(InterruptedException e){
                                    mThread.interrupt();
                                }
                            }
                        });
                        mThread.start();

 

    Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            lv.scrollTo(0, y);
        };
    };

 

 

 

[2]

다음으로  시도해 본 것은 listView.smoothScrollToPosition()이라는 메소드였는데..

int index=listView.getFirstVisiblePosition();

listView.smoothScrollToPosition(index);

는 안되는데 

listView.smoothScrollToPosition(10); 은 되구요..

 

int index=listView.getFirstVisiblePosition();

listView.setSelection(index);

은 되더군요...  

이것도 구글링 해 봤는데 결국 못찾았습니다 ㅠㅠ.. 

 

 

[1]이나 [2] 중 하나만 해결된다고 해도 충분한데.. 참 ㅠㅠ

구글링할 때 뭐라고해야할 지 감도 안오네요..

 

 
 

 

relz (2,550 포인트) 님이 2014년 8월 13일 질문

2개의 답변

0 추천
 
채택된 답변

이 방법 한번써보세요, 테스트하니 잘되긴 하네요...

맨 밑까지 쭈욱 내려주는 방법인데 원하시는 방법인지는 모르겠네요

lv.smoothScrollToPosition(adapter.getCount());

 

ontwikkelaar (2,260 포인트) 님이 2014년 8월 13일 답변
relz님이 2014년 8월 13일 채택됨
댓글 감사합니다!
맨 밑으로 한번에 내려가는 것 말고 한 단계씩 내려가게 하고 싶어서요..
음.. 스크롤속도를 조절할 수 있는지 한번 찾아봐야겠네요 ㅎㅎ..
:( ont님 조언대로 사용해 봤더니 스크롤 속도가 너무 빨라서 조절하는 방법을 찾아봤지만 나오지가 않네요..  
예전에 뷰페이저에서 사용했던 방법으로

                    Field mScroller;
                    try {
                        mScroller = ListView.class.getDeclaredField("mScroller");
                        mScroller.setAccessible(true);
                        FixedSpeedScroller scroller = new FixedSpeedScroller(MainActivity.this);
                        mScroller.set(lv, scroller);
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    }

이렇게 해 봤지만 별로 달라진 것도 없는 것 같고.. 인터넷에서 찾아보니 별로 좋지 않은 해결방법이라고 합니다..

:0..... 다시 화이팅해서 검색해보겠습니다 ..
0 추천

리스트뷰.setSelection(itemIndex);

익명사용자 님이 2014년 9월 3일 답변
...