[英]Android listview lazy loading
我想做点什么。 我想在ListView
进行延迟加载。 我的ListView
包含超过10,000个数据,仅在TextView
。 所以当我启动列表活动时,我无法在第一次加载所有数据。 它效率不高所以我可以在列表中加载前20或30个项目。 当我滚动它们时,会加载ListView
的行。 所以当我在最后一个索引上到达ListView
的最后一个索引时,我会输入进度条n它会注意到新数据被加载,所以那时新数据将加载最后一个索引。 我怎样才能做到这一点?
您可以通过使用无限的Adapter实现来实现此目的。 这正是你想要的。 您还可以限制每个滚动要刷新的行数。 这是一个链接。,
Android:为Android Market等无尽列表实现进度条和“加载...”
https://github.com/commonsguy/cwac-endless
要使用它,您可以扩展EndlessAdapter以提供有关如何处理无尽的详细信息。 具体来说,您需要能够提供独立于实际适配器中任何行的行View,它将用作占位符,而在另一种方法中,您将实际数据加载到主适配器。 然后,在您的帮助下,它可以无缝转换新数据。
让您的列表滚动更快: -
getView
中使用的条件数。 将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 !!!
}
});
}
}
您可以在此链接中找到完整的实施
//放入调用函数:
@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)
{
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.