Android

안드로이드(Android) Listview 페이징 처리 방법(setOnScrollListener)

우리가 안드로이드 앱 개발을 할때 리스트를 가져오는 경우가 있다. 이때 리스트 하단에 도달하였을 때 새로운 데이터를 불러와 리스트 아래쪽 붙여줘야하는 한다. Listview에서 스크롤을 통한 페이징 처리가 가능하다.

Listview 페이징 처리 방법

다음 예제는 스크롤이 바닥에 도달했을 때를 체크하여 다음 페이지를 호출하여 리스트에 추가하는 방법이다.

AbsListView 클래스의 setOnScrollListener() 메소드를 사용하면 된다.


import java.util.ArrayList;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class MyInfoAddressSearchResultActivity implements OnItemClickListener {
private static final String KEY_ADDRESS_TYPE = “addressType”;
private static final String KEY_SEARCH_WORD = “searchWord”;
private static final String KEY_RESULT_ZIP_CODE = “resultZipCode”;
private static final String KEY_RESULT_ADDRESS = “resultAddress”;

private ListView searchResultList;
private TextView nonSearchResult;

private String addressType = “1”;
private String searchWord;

private int currentPage = 1;
private int previousTotal = 0;
private int totPageCount = 0;
private boolean loading = true;

private ArrayList<AddressBean> arrayList = new ArrayList<AddressBean> ();
private AddressListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


searchResultList = (ListView) findViewById(R.id.myinfo_search_result);
nonSearchResult = (TextView) findViewById(R.id.myinfo_non_search_result);

adapter = new AddressListAdapter(this, R.layout.address_item, arrayList);

searchResultList.setAdapter(adapter);
searchResultList.setOnItemClickListener(this);

//스크롤시 페이징 처리
searchResultList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {

}

@Override
public void onScroll(AbsListView absListView, int firstItem, int visibleItemCount, int totalItemCount) {
Log.e(“position”, “–firstItem:” + firstItem + ” visibleItemCount:” + visibleItemCount + ” totalItemCount:” + totalItemCount + ” pageCount:” + totPageCount);
int total = firstItem + visibleItemCount;

// totalItemCount : 페이지 총 아이템 갯수
//firstItem : 리스트 첫번째 아이템 posion
// visibleItemCount : 화면에 보이는 아이템 갯수

if (loading) { //
Log.e(“position”, “totalItemCount :” + totalItemCount + ” previousTotal :” + previousTotal);
if (totalItemCount > previousTotal) { // 20 , 40 >
loading = false;
previousTotal = totalItemCount;
//currentPage++;
}
}

if(totPageCount > 0){
Log.e(“position”, “total%20 :” + total%20 + ” loading=”+loading);
if(totPageCount == currentPage) {
//Toast.makeText(MyInfoAddressSearchResultActivity.this, “마지막 페이지 입니다.”,Toast.LENGTH_SHORT).show();
} else if(!loading && (total)%20 == 0 && (totalItemCount – visibleItemCount) <= (firstItem + visibleItemCount)){ //페이지당 20개씩 노출함으로 20으로 나누고 나머지값이 0으로 떨어지면 다음 페이지 호출
currentPage = currentPage + 1;
requestPostGetAddressList(); //서버 데이터 호출
loading = true;
}
}
}
});
}

}

public class AddressBean {
   private String address;
   private String zipCode;
   private String totalPage;
   
   public String getAddress() {
      return address;
   }
   
   public void setAddress(String address) {
      this.address = address;
   }
   
   public String getZipCode() {
      return zipCode;
   }
   
   public void setZipCode(String zipCode) {
      this.zipCode = zipCode;
   }

   public String getTotalPage() {
      return totalPage;
   }

   public void setTotalPage(String totalPage) {
      this.totalPage = totalPage;
   }
}

위에 로직중 핑크색 처리한 로직은 없어도 된다. 하지만 손가락 민감도에 따라 여러페이지를 서버로 부터 호출될 수 있다.

스크롤을 아래로 내려서 바닥에 도달했을 때 한페이지씩 서버 데이터 호출이 필요할 경우

핑크색 부분의 로직은 꼭 필요하다.

Leave a Reply

error: Content is protected !!