Android ListView 스크롤


80

나는 ListView 정의 행이. 이러한 행 중 하나를 클릭하면 ListView의 데이터가 다시 생성됩니다. 이 경우 목록을 맨 위로 스크롤하고 싶습니다.

나는 처음에 이것을 달성하기 위해 setSelection(0)각 행에서 사용하려고 시도 OnClickListener했지만 성공하지 못했습니다 ( ListView 데이터가 무효화되면 스크롤 위치가 손실 되기 때문에 setSelection에 대한 호출이 취소되었습니다. 여전히 ListView가 스크롤 위치를 결정하는 방법을 이해하지 못합니다. 그러나 무효화 후).

내가 아는 유일한 작업 솔루션은 Romain Guy가 제공 한 것입니다. http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

View.post대한 호출 ( )을 포함 합니다 _listView.setSelection(0). 나는 이것이 성능이 좋지 않다는 것을 알았습니다. 새로 생성 된 목록은 스크롤 위치가 변경되지 않은 상태로 표시되며 맨 위로 스크롤되기까지 상당한 지연이 있습니다.

이 기능을 달성하는 더 좋은 방법이 있습니까?

어떤 도움이라도 대단히 감사하겠습니다.

감사!

답변:


132

listView.setSelectionAfterHeaderView();맨 위로 스크롤하려면 호출


66
그게 바로 제가 불렀을 것입니다.
markshiz

102

나는 많이 시도했지만 이것은 나를 위해 일했습니다.

list.smoothScrollToPosition(0);

3
굉장합니다. 스크롤 속도를 변경할 수 있는지 궁금합니다.
theblang

다음 화면으로 이동할 수 있도록 Scoll이 종료되는시기를 알 수있는 콜백도 있습니까?
Amol Gupta

41

나는 단순히 사용 listview.setSelection(0);

나를 위해 잘 작동합니다.


5

ListView어댑터의 데이터가 변경된 직후에 즉시 스크롤해야하는 경우 아직 채워지지 않았을 수 있습니다. 이 경우 나중에 대기열에서 호출되도록 또는 via 를 사용해야 post()합니다 .setSelection()setSelectionAfterHeaderView()Handler

listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

이것은 나를 위해 일했습니다.


4

개인적으로 다른 UI 패턴을 찾는 것이 좋습니다. 사용자가 현재 "클릭하면 목록 이 현장에서 변경 "접근 방식이 직관적이라는 것을 알 수 있지만 저는 회의적입니다.

서브 클래 싱 ListView과 오버 라이딩 layoutChildren()을 시도 하여 수퍼 클래스에 연결 한 다음 setSelection(0)필요한 경우 호출 할 수 있습니다. "상당한 지연"이 post()전화 때문인 경우 해결되어야합니다.


4
제안 해 주셔서 감사합니다. 조만간 한 번 시도해 보겠습니다. 탐색 경로가 화면의 다른 곳에 표시되기 때문에 목록이 현장에서 변경됩니다. 일반적인 Android UI 디자인은 내 특정 UI 목표 및 대상 사용자에게 적합하지 않습니다. 또한 모든 도움에 감사드립니다. 많은 stackoverflow 답변과 CommonsWare 문헌을 읽었으며이 플랫폼을 시작하는 데 크게 도움이되었습니다!
aakash

이것은 그것을하는 방법이고, 마법적인 방법이 아니라 순수한 논리 일뿐입니다. 감사!
Leo는 Monica Cellio를 지원합니다.

2

해결 방법으로 새로 생성 된 데이터를 포함하는 새 어댑터를 만든 다음 ListView.setAdapter를 호출 할 수 있습니다. 그 후 ListView.setSelection (n)을 호출합니다.

btw, commonsware에서 제공하는 솔루션이 작동합니다.


2

몇 가지 다른 요구 사항. 채팅을 할 때처럼 위로 스크롤하고 싶다면.

        mListView.smoothScrollToPosition(mAdapter.getCount());

2

이것은 listview 헤더의 edittext에 초점을 맞추고 싶을 때 잘 작동했습니다.

listview.setSelectionFromTop(0,0);

목록보기에서 특정 인덱스보기를 선택하려면

listview.setSelection(index); // o for top
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.