LIstView 에서 데이터 페이징을 구현 하는 방법 중 주로 사용되는 방법이 아마 이 두가지가 아닐까 싶다.

1. 맨 아래에 '더보기' 버튼을 놓는다.

2. 스크롤이 맨 아래에 닿았을 때 새로운 데이터를 불러 온다.


하지만, 이 두 방법은 사용자에게 정보 파악의 Delay를 발생시킨다.

빠르게, 지연없이, 정보를 쭉쭉 확인하고 싶은 사람에게는 순간순간의 Stop을 발생시키게 되는 것이다.

사용자에게 이러한 정보의 Delay를 발생시키지 않는 지연 없는 데이터 전달(Non-stop data delivery)가 필요한 경우가 있다.


위에서 나온 2번에 대한 응용으로 스크롤이 가장 마지막 Data 항목까지 가지 않고, 특정 Data항목에 다다르면 다음 Data를 불러오는 방법이다.



activity_main.xml


MainActivity.java
public class MainActivity extends Activity {
	private ListView lvMain;
	private boolean isLoading = false;
	private int mCurrentPage = 0; // 현재 페이지 번호
	private int mTotalPage = 0; // 전체 페이지 번호
	private int mItemCount= 15; // 화면에 보여줄 항목 수

	@Override
	public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
		super.onCreate(savedInstanceState, persistentState);
		setContentView(R.layout.activity_main);
		lvMain = (ListView) findViewById(R.id.lv_main);
		lvMain.setOnScrollListener(onScroll);
	}

	OnScrollListener onScroll = new OnScrollListener() {

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
			if ((totalItemCount - firstVisibleItem) < mItemCount && mCurrentPage < mTotalPage) {
				setRequestData(mCurrentPage + 1);
			}
		}
	};

	private void setRequestData(int page) {
		if (isLoading) {
			return;
		}
		isLoading = true;
		
		// TODO 데이터 통신
		// TODO 데이터 통신 완료 후 mCurrentPage값, mTotalPage값을 지정. isLoading=false로 지정.
	}
}


OnScrollListener에서 ListView 스크롤 시 남아있는 항목의 갯수를 체크하여 미리 데이터를 불러온다.

통신환경에 따라 차이는 있겠지만, 이런 방식으로 페이징을 구현하면 사용자가 데이터를 불러오느라 기다리는 시간을 단축시킴으로써 서비스의 신속성을 유지할 수 있다.



저작자 표시 비영리 변경 금지
신고
Posted by marga