본문 바로가기

IT

ListView에서 동적 추가시 하단으로 자동이동 또는 강제이동

반응형

리스트뷰에서 동적으로 row가 증가함에 따라 자동으로 이동하게 해주는 옵션이 존재한다.

layout 의 xml 에서 ListView의 속성중에 android:transcriptMode 의 속성을 적용하면 된다. 설정할 수 있는 값은 아래와 같다.


ConstantValueDescription
disabled0Disables transcript mode. This is the default value.
normal1The list will automatically scroll to the bottom when a data set change notification is received and only if the last item is already visible on screen.
alwaysScroll2The list will automatically scroll to the bottom, no matter what items are currently visible.

위의 값중에 2의 값을 가지는 alwaysScroll을 적용해줘도 정상적으로 이동하지 않는 경우가 종종 있다. 이럴때는 코딩으로 해결할 수도 있습니다. 저는 일반적으로 alwaysScroll 과 함께 코딩으로 항상 적용해 둡니다. (둘중에 하나만 되어 있는 경우 원하는데로 이동하지 않는 경우가 종종(?) 있습니다. 이유는 모르겠습니다. 일단 잘 동작하니까;;;)



보통 위와 같은 변수가 정의되어있다고 하면


동적으로 alData가 추가되면 이를 어댑터에서 리스트뷰에 정보가 변경되었다고 알리게 됩니다.


lvaData.notifyDataSetChanged() 라는 메소드를 호출하게되면 lvData의 리스트뷰에 alData의 정보가 lva에서 정의한 getView의 convertView의 형태에 따라 리스트에 예쁘게 보이게 되는 것이죠..


저의 경우 항상 추가되는 데이터가 보이도록 최하단으로 이동을 하도록 하는게 목적이었습니다.


그래서 lvaData.notifyDataSetChanged() 해당 메소드를 호출하기전에


라는 식으로 코딩을 하였습니다.



**주의 : 처음에는 아래와 같이 notifyDataSetChanged() 메소드를 먼저 호출하고 setSelection을 이후에 실행되도록 했었습니다. 한데 이런식으로 코딩하면 원하는 데로 마지막으로 이동하는 것이 정상적으로 이루어지지 않더군요..



반응형