loadlistview.png

[Android] 동적으로 다음페이지를 로딩하는 ListView 구현

아이폰의 수많은 UITableView를 활용하는 어플리케이션을 보면 참 퀄리티 높게 잘 만든것이 자동으로 리스트의 가장 아래로 내려가면 알아서 다음페이지를 로딩하는 기능이 아닐까 싶습니다. 안드로이드에서도 요즘은 많은 어플리케이션이 해당 기능을 구현하고 있습니다. 안드로이드에서는 리스트뷰와 데이터간에 Adapter라는 디자인패턴을 활용하고 있어 아이폰의 그것과는 같은 기능이라도 구현하는 방식이 다릅니다.

안드로이드에서는 좀 더 적극적으로 Adapter를 활용하여 이 기능을 구현해야 합니다. 어찌보면 조잡하고 어찌보면 더 쉽게 구현할 수 있습니다. 길게 이야기할것 없이 예제 소스를 보여드리겠습니다.

여기서 주목할 부분은 onScroll 메서드 입니다. 스크롤이 일어날때마다 해당 메서드가 호출이 되며 위의 소스에서는 가장 마지막셀이 디스플레이 되었는지를 검사하게 됩니다. 마지막 셀이 나왔다면 현재 리스트가 Lock상태인지를 체크 합니다. 여기서 쓰이는 멤버 변수가 mLockListView 입니다.

해당 변수를 사용하여 리스트에 데이터가 변화하는 순간에는 스크롤 이벤트를 막아 이벤트의 중복 요청을 막게 됩니다. 위에서 Inflater를 활용하여 FooterView를 붙이는 과정이 있는데요 이것이 사용자로 하여금 페이지 로딩중임을 알리게 되는 중요한 요소입니다.

사용자 삽입 이미지

  • dk

    좋은 정보 잘보고 가요 감사합니다~

  • 감사합니다. 딱 필요하던건데!

  • KYO

    소스가 없는데 어디에 올려져 있는거죠???

  • GangWook Byeon

    자바, 안드로이드 처음 해봅니다.
    제게 꼭 필요한 기능이기에 따라 해봤는데, 시간이 오래되어 그런지 게시물의 소스데로는 잘 안되더군요.
    Runable관련
    속도딜레이를 위한 꼼수는 해결을 못했습니다.

    안드로이드 스튜디오(안드로이드 최소 버전 4.0) 에서 작업했습니다.

    import android.database.DataSetObserver;

    import android.os.Bundle;

    import android.support.design.widget.FloatingActionButton;

    import android.support.design.widget.Snackbar;

    import android.support.v7.app.AppCompatActivity;

    import android.support.v7.widget.Toolbar;

    import android.view.View;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.ViewGroup;

    import android.widget.AbsListView;

    import android.widget.Adapter;

    import android.widget.ArrayAdapter;

    import android.widget.ListView;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{

    private ArrayAdapter gAdapter;

    private ListView gListView;

    private ArrayList gArrayList;

    private boolean gLockListView;

    private int reflashCnt = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);

    //멤버변수 초기화

    gLockListView = true;

    gArrayList = new ArrayList();

    //어댑터와 리스트뷰 초기화

    gAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, gArrayList);

    gListView = (ListView)findViewById(R.id.listView);

    //스크롤 리스너 등록

    gListView.setOnScrollListener(this);

    gListView.setAdapter(gAdapter);

    //데이터추가

    addItems(50,0,0,0);

    }

    private void addItems(final int size, int firstVisibleItem, int visibleItemCount, int totalItemCount)

    {

    reflashCnt = reflashCnt + 1;

    gLockListView = true;

    for(int i=0;i=count && totalItemCount!=0 && gLockListView==false)

    {

    addItems(50,firstVisibleItem, visibleItemCount, totalItemCount);

    }

    }

    }

    • 아이

      이 글이 이해하기 힘드시면 우선 자바, 안드로이드 관련 책을 한권정도씩은 떼시길 추천드립니다.