15

我想做一些事情。我想做延迟加载ListView。我的ListView包含超过 10,000 个数据并且仅在TextView. 所以当我启动列表活动时,我无法在第一次加载所有数据。它效率不高,所以我可以加载列表中的前 20 或 30 个项目。ListView当我滚动它们时,会进一步加载这些行。因此,当我到达最后一个索引的ListView最后一个索引时,我将放置进度条 n 它会注意到新数据已加载,因此届时将使用 last + 1 索引加载新数据。我怎样才能做到这一点?

4

4 回答 4

17

您可以通过使用无限适配器实现来实现这一点。这正是你想要的。您还可以限制每次滚动刷新的行数。这是它的链接。,

Android:为 Android Market 等 Endless List 实现进度条和“正在加载...”

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

要使用它,您可以扩展 EndlessAdapter 以提供有关如何处理无穷无尽的详细信息。具体来说,您需要能够提供一个独立于实际适配器中的任何行的行视图,该视图将用作占位符,而您可以通过另一种方法将实际数据加载到主适配器。然后,在您的帮助下,它会在新数据中无缝转换。

于 2012-05-22T06:12:01.667 回答
2

让您的列表滚动得更快:-

  1. 减少getView适配器中使用的条件数量。
  2. 减少您在日志中收到的垃圾收集警告的数量
  3. 添加滚动功能(限制每次滚动刷新的行数)
于 2015-07-12T06:03:43.790 回答
2

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 !!!
                }
            });
        }
    }

您可以在此链接中找到完整的实现

于 2016-05-26T19:11:20.737 回答
0

//put in calling function :

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

and inner class:

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)
    {

    }

}
于 2014-10-07T10:48:24.197 回答