我正在创建一个应用程序,我正在使用网格视图来显示我的所有图像,问题是我有很多图像,大约12,000,我不想在开始时加载所有图像,因为让我们面对它,它将需要永远,所以我想知道一旦gridview到达终点,访问服务器获取更多项目的最佳方式是什么。
感谢。
答案 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
之前加载图片,可以使用OnScrollListener
,AsyncTask
和列表以另一种方式执行此操作`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张图像。