2013-02-25 2 views
2

웹 사이트에서 데이터를 가져올 사용자 정의 목록 뷰를 구현해야합니다. 목록의 끝에 도달하면 새로운 API 호출이 이루어집니다. 나는 새로운 데이터를 백그라운드에서 계속 가져 와서리스트 끝에 도달했을 때 보여 주면 마음을 먹지 않을 것이다.목록의 끝에 도달하면 안드로이드리스트 뷰에 데이터 자동로드

가장 좋은 방법은 무엇입니까?

지금 나는 scrollview를 만들었습니다. api 호출을 통해 10 개의 레코드를 가져 와서 선형 레이아웃을 만들고 scrollview에 추가합니다. 스크롤을 듣고 끝에 도달하면 새로운 API 호출을 만들고 스크롤 뷰에 다시 추가합니다. 그러나 성능은 좋지 않으며 때로는 멈춰 버립니다.

더 좋은 방법을 구현하려면?

답변

2

나는 실제로 지난 밤에 대해 블로그를 썼다. 그것은 당신이하는 것을 요구하고있는 정확하게 행동해야합니다 : http://www.thekeyconsultant.com/2013/02/android-simple-endless-lists-with.html. 설명이 필요하면 알려주세요.

이 예제는 데이터 세트의 절반 아래로보기가로드 될 때 다음 데이터 세트로드를 시작합니다. 이 방법으로 사용자가 천천히 스크롤하면 목록의 "끝"을 볼 수 없습니다. 요구 사항 인 경우 끝까지 기다리도록 변경할 수 있습니다.

+0

안녕하십니까, 답장을 보내 주셔서 감사합니다. 나는 계속 시도 할 기회가 있습니다. 곧 답변 드리겠습니다. – Calvin

0

어댑터를 사용하는 대신 스크롤링을 확인하는 것이 좋습니다. 사용자가 아무리 많은 항목 (0조차도)을 처리 할 수 ​​있으며 어댑터보기에 표시되는 내용에 따라 추가로드를 정확히 수행 할 때 사용자 정의 할 수 있기 때문입니다. 그것은 당신이 다른 수십 스크롤이 바닥에 닿을 때마다 찾고 매겨진 쿼리를 구현해야하는 경우 매개 변수를 저장하는 스크롤 리스너의 구현입니다

mAdapterView.setOnScrollListener(new OnScrollListener() 
    { 
    ... 
    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    { 
    final boolean needLoading =!mIsLoadingNewData&& firstVisibleItem + visibleItemCount >= mAdapter.getCount() - 1; 
    mIsLoadingNewData=true; 
    if(needLoading) 
     //load the new data and then update the adapter with new data and then set mIsLoadingNewData to false 
    } 
0

:

여기에 샘플 코드입니다.

private class ScrollListener implements AbsListView.OnScrollListener { 

    private int currentScrollState; 
    private int totalItemCount; 
    private int currentVisibleItemCount; 
    private boolean loading; 
    private int pageSize = 10; 
    private int offset = 0; 

    public void setLoading(boolean loading) { 
     this.loading = loading; 
    } 

    public int getPageSize() { 
     return this.pageSize; 
    } 

    public int getOffset() { 
     return this.offset; 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     this.currentScrollState = scrollState; 
     this.isScrollCompleted(); 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     this.currentVisibleItemCount = firstVisibleItem + visibleItemCount; // last item 
     this.totalItemCount = totalItemCount; 
    } 

    private void isScrollCompleted() { 
     if (this.currentVisibleItemCount > 0 
       && this.totalItemCount - 1 == this.currentVisibleItemCount 
       && this.currentScrollState == SCROLL_STATE_IDLE) { 
      // Detect if there's been a scroll which has completed and load more 
      if (!loading && preguntas.getAdapter() != null) { 
       loading = true; 
       offset += pageSize; 
       loadMoreData(offset, pageSize); 
      } 
     } 
    } 
} 
관련 문제