2012-05-22 7 views
13

나는 몇 가지 물건을 갖고 싶다. ListView에 게으른 로딩을하고 싶습니다. 내 ListView은 &의 데이터가 10,000 개를 초과하여 TextView에만 있습니다. 그래서 내가 목록 활동을 시작할 때 모든 데이터를 처음으로로드 할 수는 없습니다. 그것은 효율적이지 않아 목록에서 처음 20 또는 30 개의 항목을로드 할 수 있습니다. 더 이상 행을 스크롤 할 때 ListView 행이로드됩니다. 그래서 내가 마지막 색인에 ListView의 마지막 색인에 도달하면, 나는 새로운 데이터가 마지막으로 + 1 색인과 함께로드 될 때 새로운 데이터가로드된다는 점에 유의하여 progressbar를 놓을 것입니다. 내가 어떻게 할 수 있니?안드로이드리스트 뷰 지연로드

+1

당신이 시도 것을 보여줄 수 찾을 수 있습니까? – gideon

+0

예 여기에 이미지를 예제로 추가했습니다.이 하나를 선택하십시오 – Jai

+0

피카소는 어떨까요? 이것이 당신의 필요를 충족 시키는가? http://square.github.io/picasso/ – phi

답변

19

무한 어댑터 구현을 사용하여이 작업을 수행 할 수 있습니다. 이것은 당신이 원하는 것을 정확하게합니다. 스크롤 당 새로 고칠 행 수를 제한 할 수도 있습니다. 여기에 대한 링크입니다.,

Android: Implementing progressbar and "loading..." for Endless List like Android Market

https://github.com/commonsguy/cwac-endless

를 사용하려면

, 당신은 endlessness을 처리하는 방법에 대한 세부 사항을 제공하기 위해 EndlessAdapter을 확장합니다. 특히, 실제 어댑터의 행과 독립적으로 행 뷰를 제공 할 수 있어야합니다. 행 뷰는 다른 방법으로 실제 데이터를 메인 어댑터에로드하는 동안 자리 표시 자 역할을합니다. 그런 다음 약간의 도움을 받아 새로운 데이터로 자연스럽게 전환됩니다.

+0

고마워, 이걸 시험해 보게. – Jai

+1

링크가 깨졌습니다! :( –

0

는 전화 기능에 넣어 // :

@Override 
public View onCreateView(android.view.LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    ScrollListener scrollListener = new ScrollListener(); 
    listView.setOnScrollListener(scrollListener); 
} 

및 내부 클래스 :

class ScrollListener implements OnScrollListener 
{ 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    { 
     int size = searchedPeople.size(); 
     if(isScrolled && totalItemCount != 0 && size < totalPeoples) 
     { 

      if(firstVisibleItem + visibleItemCount >= totalItemCount) 
      { 

        yourfunction(size, size + limit); // call service in your functioin 

       isScrolled = false; 
      } 
     } 

    } 

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

    } 

} 
0

귀하의 목록을 스크롤합니다 빨리 : -

  1. 사용 조건의 수를 줄이 어댑터의 getView
  2. 는 로그
  3. 추가 스크롤 기능 얻을 가비지 컬렉션 경고 수 (스크롤마다 갱신되는 행의 수를 제한)
1

리스트 뷰에 onScrollListener 추가를 줄입니다. 사용자가 스크롤하면 ListView의 끝이 가까워 졌는지 확인합니다. 그렇다면 더 많은 데이터를 가져옵니다. 예를 들어 :

public abstract class LazyLoader implements AbsListView.OnScrollListener { 

    private static final int DEFAULT_THRESHOLD = 10 ; 

    private boolean loading = true ; 
    private int previousTotal = 0 ; 
    private int threshold = DEFAULT_THRESHOLD ; 

    public LazyLoader() {} 

    public LazyLoader(int threshold) { 
     this.threshold = threshold; 
    } 

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

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     if(loading) { 
      if(totalItemCount > previousTotal) { 
       // the loading has finished 
       loading = false ; 
       previousTotal = totalItemCount ; 
      } 
     } 

     // check if the List needs more data 
     if(!loading && ((firstVisibleItem + visibleItemCount) >= (totalItemCount - threshold))) { 
      loading = true ; 

      // List needs more data. Go fetch !! 
      loadMore(view, firstVisibleItem, 
        visibleItemCount, totalItemCount); 
     } 
    } 

    // Called when the user is nearing the end of the ListView 
    // and the ListView is ready to add more items. 
    public abstract void loadMore(AbsListView view, int firstVisibleItem, 
            int visibleItemCount, int totalItemCount); 
} 

활동 :

public class MainActivity extends AppCompatActivity { 

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

      setContentView(R.layout.main_layout); 
      ListView listView = (ListView) findViewById(R.id.listView); 

      listView.setOnScrollListener(new LazyLoader() { 
       @Override 
       public void loadMore(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
        // Fetch your data here !!! 
       } 
      }); 
     } 
    } 

당신은 완벽하게 구현 at this link

관련 문제