2012-05-22 155 views
13

我想做一些東西。我想在ListView做懶加載。我的ListView包含超過10,000個數據&只在TextView。所以當我啓動列表活動時,我無法在第一次加載所有數據。這是不高效的,所以我可以加載列表中的第20或30項。當我滾動它們時,進一步加載ListView的行。所以當我到達最後一個索引的最後一個索引ListView時,我會放置進度條n它會注意到新數據被加載,所以那時新數據將加載最後一個+1索引。我怎樣才能做到這一點?Android listview懶惰加載

+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

要使用它,您擴展EndlessAdapter提供有關如何處理的無窮無盡的細節。具體來說,您需要能夠提供一個獨立於實際適配器中任何行的View行,它將用作佔位符,而另一種方法則是將實際數據加載到主適配器中。然後,藉助您的一點幫助,它可以無縫地轉換新數據。

+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。當用戶滾動時,檢查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