Programing

Android ListView 스크롤

lottogame 2020. 10. 11. 09:04
반응형

Android ListView 스크롤


나는이 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). 나는 이것이 성능이 매우 좋지 않다는 것을 알았습니다. 새로 생성 된 목록은 스크롤 위치가 변경되지 않은 상태로 표시되며 맨 위로 스크롤되기까지 상당한 지연이 있습니다.

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

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

감사!


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


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

list.smoothScrollToPosition(0);

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

나를 위해 잘 작동합니다.


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

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

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


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

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


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

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


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

        mListView.smoothScrollToPosition(mAdapter.getCount());

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

listview.setSelectionFromTop(0,0);

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

listview.setSelection(index); // o for top

참고 URL : https://stackoverflow.com/questions/2889793/android-listview-scrolling-to-top

반응형