2012-05-22 63 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