[android] 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());