채팅 어플을 만드는 중에 마지막단에 막히는 부분이 있어 조언을 구하고자
글을 남깁니다.
채팅 내용 즉 주고 받은 대화가 어느정도 쌓여 있다는 가정, 그리고 채팅방을 나갔다가 재접근하는경우에
기존 채팅목록이 100개 이며, 마지막에 대화하나 내용을 20개 보여주고
상단으로 스크롤 할경우 비동기로 데이터를 불러와서, 이전 대화내용을 볼수 있는 upward paging 구현하고 있습니다.
기술적으로는 페이징할때 ListViewAdapter에서 List 데이터 객체를 LinkedList로 하여, 상단 객체 추가시addFirst 메서드를 사용해서 구현하고 있습니다.
문제는 여기서 아이템이 ListView추가될 때 좀더 부드럽게 스크롤링을 하고 싶은데, 말처럼 쉽지가 않네요.
상단으로 추가되는 아이템 만큼 ListView의 position과 높이를 구해서 기존 포지션을 유지하게 UI를 처리하려고 하며, 아래의 메서드로 처리해주고 있습니다.
public void addFirstItems(LinkedList<ChatMsg> msgList){
this.lastTopPosition = mListView.getFirstVisiblePosition();
int startCount = this.getCount();
//scrolledToIndex = getListView().getFirstVisiblePosition();
View v = mListView.getChildAt(0);
topOffset = (v == null) ? 0 : v.getTop();
for (int i = 0; i < msgList.size(); i++) {
ChatMsg lastMsg = (i == 0) ? this.listData.getFirst() : msgList.get(i - 1);
ChatMsg dateMsg = this.generateDateChatMsg(msgList.get(i), lastMsg,false);
if(dateMsg != null){
lastTopPosition++;
this.listData.addFirst(dateMsg);
}
lastTopPosition++;
this.listData.addFirst(msgList.get(i));
} //end for____
this.notifyDataSetChanged();
this.handler.postDelayed(new Runnable() {
@Override
public void run() {
// mListView.setSelection(lastTopPosition);
mListView.setSelectionFromTop(lastTopPosition,topOffset);
}
},0);
} //end method__
이것보다 더 나은 방법이 없는지 알고 싶습니다.
예를 들면 카카오톡 대화창에서 이전 대화내용을 보기위해서 위쪽으로 스크롤링하면,
상당히 부드럽게 처리되고 있습니다.
분명 묘책이 있을텐데, 카톡 어플을 디컴파일해서 보구 있는데, 난독화때문에 찾기 또한 힘드네요.
여러 고수님들의 조언 부탁드립니다.