728x90

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

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

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

 

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

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

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

 

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

activity_main.xml
<relativelayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent">

	<listview
		android:id="@+id/lv_main"
		android:layout_width="match_parent"
		android:layout_height="match_parent">
	</listview>
</relativelayout>
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 스크롤 시 남아있는 항목의 갯수를 체크하여 미리 데이터를 불러온다.

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

 

 

728x90

+ Recent posts