Listview 목록을 업데이트 한 후 목록 끝으로 스크롤


292

listAdapter를 사용하여 목록보기를 업데이트 한 후 목록이 맨 아래로 스크롤되도록하여 목록에 입력 된 마지막 요소를 표시하고 싶습니다. 어떻게해야합니까?

나는 이것을 시도했지만 운이 없다 :

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

감사합니다


이 작업을 시도해보십시오 ... messagesListView.setTranscriptMode (ListView.TRANSCRIPT_MODE_NORMAL); messagesListView.setStackFromBottom (true);
Superdev

lv.setTranscriptMode (ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL)는 adapter.notifyDataSetChanged를 호출 한 후 listView가 아래로 스크롤되도록합니다. 이것이 작동하지 않으면 아래 게시물에서 볼 수 있듯이 xml로이 속성을 정의하십시오.
tomm

답변:


418

목록 데이터가 변경된시기를 알고 있다고 가정하면 목록 선택을 마지막 행으로 설정하여 목록을 맨 아래로 스크롤하도록 수동으로 지시 할 수 있습니다. 다음과 같은 것 :

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@Bhupendra는 필요하지 않습니다. Warting의 답변에 표시된 것처럼 스레드없이 할 수 있습니다.
sagarpatidar

2
@Bhupendra setSelection ()은 UI를 업데이트합니다. 뷰에서 post (Runnable)를 호출하면 Android UI 스레드에서 Runnable 코드가 실행됩니다. 이미 UI 스레드에 있거나 다른 방법으로 확인하지 않는 한 일반적 으로이 방법을 사용하십시오.
메이슨 리

5
또한 새로 설정된 어댑터에서 포스트를 사용하면 스크롤 스레드 애니메이션이 발생하고 메인 스레드에 있어야하며 어댑터를 설정 한 직후에 setSelection을 사용하면 스크롤 애니메이션이 발생하지 않습니다.
Gianluca P.

1
케빈의 대답에 대해 메이슨 리가 언급 한 @SaifHamed는 또한 짧은 목록이 의도 된 동작이 아닐 수도있는 하단 대신 맨 위의 "빈"공간을 갖도록합니다.
dashhund

16
myListView.smoothScrollToPosition (myListAdapter.getCount ()-1);을 사용할 수도 있습니다. 부드러운 스크롤을 위해
Zar E Ahmer

238

목록보기에서 다음 매개 변수를 사용해야합니다.

  • 스크롤 lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • 리스트의 머리를 아래로 설정 lv.setStackFromBottom(true);

이러한 매개 변수를 XML로 설정할 수도 있습니다 (예 : 이처럼 :

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
이 방법을 사용하면 행이 추가 될 때 뷰의 "하단에서 쌓입니다". 즉, 짧은 목록은 맨 아래가 아니라보기의 맨 위에 "빈"공간을 갖게되므로 항상 원하는 것은 아닙니다.
메이슨 리

2
빠른 질문 : 스크롤을 애니메이션으로 만들 수있는 방법은 무엇입니까? 통지 할 때 현재 DataSetChanged () 애니메이션없이 점프합니까?!?
Georg

@Georg 장치의 개발자 옵션에서 애니메이션을 비활성화 했습니까?
JonasCz-복원 모니카

35

TRANSCRIPT_MODE_ALWAYS_SCROLL과 setSelection의 조합으로 저에게 효과적이었습니다.

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

버튼 클릭에 대한 응답으로 이것을 사용하여 성공 했으므로 내용을 업데이트 한 후에도 사용할 수 있다고 생각합니다.

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
이것은 훌륭한 솔루션입니다. 한 줄로 간단합니다.
Josh Larson

12

이것을 ListFragment에서 얻으려면 :

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

누군가가 ListFragment와 동일한 문제에 대해 Google 검색을하면이 것을 발견하기 때문에이 답변을 추가했습니다.

문안 인사


9

사용 : 목록의 머리를 아래로 설정 lv.setStackFromBottom(true);

나를 위해 일했고 목록이 처음 표시되면 자동으로 맨 아래로 스크롤됩니다. 그런 다음 목록이와 같이 스크롤됩니다 TRANSCRIPT_MODE_ALWAYS_SCROLL.


6
이 방법을 사용하면 행이 추가 될 때 뷰의 "하단에서 쌓입니다". 즉, 짧은 목록은 맨 아래가 아니라 맨 위의 "빈"공간을 갖게됩니다.
메이슨 리

5

나는 사용한다

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

하단에 항목을 추가하고 오래된 항목은 대화 내용과 같이 상단에서 스크롤합니다.


getListView().smoothScrollToPosition(getListAdapter.getCount() - 1);활동 시작시 맨 아래로 스크롤하려면 onstart를 호출 하십시오.
palindrom

4

가장 간단한 해결책은 다음과 같습니다.

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

대화 모드는 원하는 것이며 Google 토크 및 SMS / MMS 애플리케이션에서 사용됩니다. 항목을 추가 할 때 어댑터에서 notifyDatasetChanged ()를 올바르게 호출하고 있습니까?


그래 목록은 올바르게 업데이트되지만 항상 처음부터 시작됩니다. 새 항목을 추가하고 항상 목록 끝으로 스크롤하려면 필요합니다.
jramirez

스크립트 모드는 실제로 SMS 앱에 의해 비활성화되어 있습니다. 왜 그런지 정확히 기억하지 못합니다.
Timmmm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.