listView에 새로운 아이템을 추가할 때 스크롤되지 않도록 하는 방법이 있는지요?

안녕하세요?

listView에 새로운 listItem을 추가하면 새로 추가된 listItem들이 표시되면서 스크롤되는데요,
이 때 스크롤되지 않고 현재 화면에 표시된 내용을 그대로 유지하는 방법이 있는지요?

Ti API로는 현재 없는 것 같아요. Android SDK의 경우에는 listview의 transcriptMode를 지정하면 되는 것 같은데 모듈을 만들거나 sdk를 수정해서 하셔야할 것 같아요.
나중에 성공하면 꼭 공유해주세요. :slight_smile:

1개의 좋아요
$.section.appendItems(rows, {animated:false});

으로 넣으면 스크롤 일어나지 않고 추가됩니다.

인피티니 스크롤 만들때 스크롤 양 만큼 미리 미리 더하는 용도로 쓰는데 iOS/Android 모두 잘 되는데요.

여기서부터는 +

저는 스크롤 속도가 가져와서 더하는 속도보다 빠를때 로딩 마스크를 보여주기 위해서 rows마지막에 항상

rows.push({ template : 'loadingRow'});

로딩 마스크가 포함된 row를 추가해 둡니다.

그래서 더할 때 마지막열을 치환해주고 있고, 이 경우에도 스크롤 없이 잘 더해집니다.

$.section.replaceItemsAt($.section.items.length - 1, 1, rows, {animated:false});

타이타늄 짱!

2개의 좋아요

위쪽으로 스크롤 시키면서 리스트 앞 부분에 아이템을 추가할 때는 어떻게 해야 되는지요?
insertItemsAt()으로 추가하니까 스크롤되더군요.

아… 작년에 메신저 앱 만들때 그거 때문에 고생했는데요…
그 경우에는 스크롤을 복원 시켜주는 방법 밖에는 못 찾았습니다.
그래서 일단 scrollend 이벤트에서 받아지는 정보로 스크롤 시켜줬어요…

$.messageSection.insertItemsAt(0, addRows, { animated: false });

if (OS_IOS) {
    listVisibleItemIndex = addRows.length + e.visibleItemCount - 1;
} else {
    listVisibleItemIndex = addRows.length;
}
$.messageView.bottom = 0;
$.messageView.scrollToItem(0, listVisibleItemIndex, { animated: false } );

지금 다시 한다고 하면 방법이 나왔거나, 아니면 모듈을 만들어서 해결해야겠죠.

1개의 좋아요

이렇게 했을 때 결국 스크롤이 튀는게 좀 눈에 보입니다…
그래서 별로 권장할만하지는 않아요-_ -
깔끔하게 동작시키기 위해서는 SDK를 고치거나 모듈을 만드셔야 할겁니다.

1개의 좋아요

답변 감사합니다. ^^

저도 구글링하다 보니 tableView에서 scroll 이벤트를 사용하여 화면에 표시된 아이템의 개수를 저장했다가 위치를 복구하는 방법이 있어서 Ti API로 해결이 안되면 그 방법으로 구현하려고 생각 중이었습니다.

제가 검색했던 자료에서는 스크롤이 복구될 때 튀는걸 약간 줄여보려고 opacity를 0으로 만들었다가 복구 후에 다시 1로 만드는 방법까지 쓰더군요,
그렇게 구현해보니 화면이 한번 깜빡이긴 하는데 스크롤되는 장면은 보이지 않았습니다.

그럼 좋은 하루 되세요~

위 글을 보니 전에 화면이 잠깐 이상해지는 것을 감추기 위해 했던 꼼수가 생각나네요.

toImage()함수로 화면에 보이는 전체를 캡쳐해서 그걸 맨 앞에 ImageView로 띄우고. 뒤에서 view를 조작한 다음에 앞의 ImageView를 없앴던 참 안스러운(?) 꼼수를 썼던 적이 있지요. ㅎㅎ

1개의 좋아요

와… 거기까지는 정말 생각도 못했는데 좋은 방법인 것 같네요~ ^^
Ti API에서 얼른 스크롤 잠그는 기능을 제공해주면 좋겠습니다.