Android ListView에서 프로그래밍 방식으로 특정 위치로 스크롤


157

어떻게 프로그래밍 방식으로 특정 위치로 스크롤 할 수 ListView있습니까?

예를 들어,가 있고 String[] {A,B,C,D....}의 맨 위에 보이는 항목 ListView을 my의 인덱스 21 로 설정해야합니다 String[].



답변:


386

직접 스크롤의 경우 :

getListView().setSelection(21);

부드러운 스크롤 :

getListView().smoothScrollToPosition(21);

쿨, 이것은 내가 원하는 것입니다!
jiasli

훌륭하고 매우 유용하며 시간을 절약 할 수 있습니다. 감사.
Neha Agarwal

또 다른 차이점 : 첫 번째는 목록의 중간에 설정하려고합니다.
Victor Pinto

11
smoothScrollToPosition작동하지 않습니다, 어떤 제안?
SweetWisher ツ

1
@SweetWisher ツ는 다음과 같은 실행 지연을 게시하려고 시도합니다.listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

스크롤 시간이있는 SmoothScroll의 경우 :

getListView().smoothScrollToPositionFromTop(position,offset,duration);

매개 변수
position->
오프셋 으로 스크롤 할 위치 ----> 스크롤이 완료 될 때 뷰의 상단에서 원하는 위치의 픽셀 단위 거리-> 스크롤
에 사용할 밀리 초 수

참고 : API 11부터

HandlerExploit의 대답은 내가 찾던 것이었지만 내 목록보기는 상당히 길며 알파벳 스크롤러도 있습니다. 그런 다음 동일한 함수가 다른 매개 변수를 취할 수 있음을 발견했습니다. :)


편집 : (AFD 제안에서)

현재 선택을 배치하려면

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

잘 작동합니다. 답변을 개선하기 위해 stackoverflow.com/questions/5540223/…에
AFD

v.getHeight () 란 무엇입니까?
Panache

@Panache v는 listview의 행입니다
amalBit

나는 youuuuuu를 좋아합니다
Joao Ferreira

10

다음과 같이 코드를 핸들러에 넣습니다.

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

그런 다음이 방법을 호출하십시오.

timerDelayRunForScroll(100);

건배!!!


7

OnGroupExpandListener를 설정하고 onGroupExpand ()를 다음과 같이 재정의했습니다.

setSelectionFromTop () 메서드를 사용하여 선택한 항목을 설정하고 선택 항목을 ListView의 위쪽 가장자리에서 y 픽셀만큼 배치합니다. (터치 모드 인 경우 항목이 선택되지 않지만 여전히 적절하게 배치됩니다.) (Android 문서)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

lisview를 스크롤하는 동안 다른보기를 동시에 스크롤해야합니다. 스크롤을 위해 listview에서 setSelectionFromTop을 사용하면 다른 뷰의 스크롤 속도가 느려지는 UI 스레드가 차단됩니다. 어떻게해야하는지 제안 해 줄 수 있습니까?
VijayRaj

7

Listview표시되지 다음이를 사용하는 경우 스크롤이 스크롤에 기본적으로 상단에 위치하지만, 원하는 될 것입니다 :

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

덕분에 내 문제를 해결 @zalak, 당신을 포기
Mitul Bhadeshiya에게

5

Gmail 앱과 유사한 기능을 찾는 사람이 있다면

Listview 스크롤은 기본적으로 맨 위에 위치합니다. 힌트 주셔서 감사합니다. amalBit. 빼기 만하면됩니다. 그게 다야.

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);

4

UP / DOWN 버튼을 사용하여 스크롤 목록보기

누군가 목록 처리에 관심이 있다면 버튼을 사용하여 한 행을 위 / 아래로 봅니다. 그때.

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});

나는 당신이 현재 위치를 얻는 방법을 보여준 유일한 사람이기 때문에 당신에게 투표를 주지만, 당신은 모범을 향상시켜야합니다.
Panciz

4

목록에서 원하는 위치로 직접 이동하려면 다음을 사용하십시오.

listView.setSelection (int position);

listView에서 원하는 위치로 부드럽게 이동하려면 다음을 사용하십시오.

listView.smoothScrollToPosition (int position);


3

이것이 나를 위해 일한 것입니다. amalBit & Melbourne Lopes의 답변 조합

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

그런 다음이 메소드를 다음과 같이 호출하십시오.

timerDelayRunForScroll(400);

1

그것의 쉬운 list-view.set 선택 (당신 pos); 또는 공유 우선 순위로 위치를 저장할 수 있으며 활동을 시작할 때 환경 설정을 취하고 해당 int로 설정합니다.


내가하고 싶었던 것은 스크롤 애니메이션없이 자동으로 목록의 맨 위로 이동하는 것입니다. 이것은 완벽하게 작동했습니다
RH201

1

-목록을 특정 위치로 위로 스크롤하려면 \

myListView.smoothScrollToPosition(i);

-myListView에서 특정 항목의 위치를 ​​얻으려면 :

myListView.getItemAtPosition(i);

또한 myListView.getVerticalScrollbarPosition(i);도움 이 될 수 있습니다.

행운을 빕니다 :)


0

listView의 스크롤 위치를 정확하게 정의하려면 두 가지가 필요합니다.

현재 listView 스크롤 위치를 가져 오려면 :

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

listView 스크롤 위치를 설정하려면

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

-1

두 가지 다른 버튼을 사용하여 위아래로 스크롤 할 수있는이 솔루션을 찾았습니다.

@Nepster가 제안한대로 getFirstVisiblePosition () 및 getLastVisiblePosition ()을 사용하여 프로그래밍 방식으로 스크롤을 구현하여 현재 위치를 가져옵니다.

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

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