Android - 在网格视图到达结束时加载更多项目

时间:2015-12-31 17:32:07

标签: android gridview scroll

我正在创建一个应用程序,我正在使用网格视图来显示我的所有图像,问题是我有很多图像,大约12,000,我不想在开始时加载所有图像,因为让我们面对它,它将需要永远,所以我想知道一旦gridview到达终点,访问服务器获取更多项目的最佳方式是什么。

感谢。

2 个答案:

答案 0 :(得分:2)

要在滚动到gridview结尾时加载更多项目

gridView.setOnScrollListener(new AbsListView.OnScrollListener(){

            @Override
            public void onScroll(AbsListView view,
                                 int firstVisibleItem, int visibleItemCount,
                                 int totalItemCount) {
                //Algorithm to check if the last item is visible or not
                final int lastItem = firstVisibleItem + visibleItemCount;
                if(lastItem == totalItemCount){
                    // here you have reached end of list, load more data
                    fetchMoreItems();
                }
            }
            @Override
            public void onScrollStateChanged(AbsListView view,int scrollState) {
                //blank, not required in your case
            }
        });

答案 1 :(得分:1)

一种方法是在适配器getView()中启动服务器对图像的请求。请求完成后,您可以在ImageView上设置检索到的位图。 Android开发者博客上对此技术进行了非常深入的描述:Multithreading For Performance | Android Developers Blog。大多数服务器都足够快,以至于显示图像的滞后时间并不令人讨厌。

但是,如果您想在显示ImageViews之前加载图片,可以使用OnScrollListenerAsyncTask和列表以另一种方式执行此操作`GridView。

的适配器

假设您有一个常数final int THRESHOLD = 50;和一个从零开始的变量lastItem

当用户显示GridView AsyncTask开始并检索前100张图片时。在onPostExecute()中,它会将图像添加到适配器并调用notifyDataSetChanged()。它还为lastItem添加了100。

所以现在你的适配器有100张图片。用户正在滚动图像并调用OnScrollListener

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

    if (firstVisibleItem >= lastItem - THRESHOLD) {
        new FetchImageAsyncTask().execute();
    }
}

您的AsyncTask执行,lastItem更新为200,您的适配器再获得100张图片。

然后用户滚动一些,然后重新开始。

通过使用阈值,用户可以在列表结尾之前滚动另外50张图像,这可能足以加载下100张图像。