我想要做一些东西。 我想要做的懒加载中ListView
。 我的ListView
包含超过10000个数据和只在TextView
。 所以当我启动列表活动我无法加载在第一次所有的数据。 它的效率不高,所以我可以加载首先在列表20个或30个项目。 进一步的行ListView
,当我在滚动它们被加载。 所以,当我在最后指数达到ListView
上最后一个索引,我就会把进度ñ它会注意到,新的数据被加载,所以当时的新数据将负载与去年+ 1指数。 我怎样才能做到这一点?
Answer 1:
您可以通过使用无尽的适配器实现实现这一目标。 这正是你想要做什么。 您还可以限制每个滚动被刷新的行数。 这里是一个链接,
安卓:像Android Market的无尽列表实施进度和“载入中...”
https://github.com/commonsguy/cwac-endless
要使用它,您扩展EndlessAdapter提供有关如何处理的无穷无尽的细节。 具体来说,您需要能够提供一排景观,独立于任何在您的实际适配器行的,将作为在你的占位符,在另一种方法,负载的实际数据到您的主适配器。 然后,从你的帮助不大,它的无缝切换的新数据。
Answer 2:
让你的列表中滚动更快: -
- 减少在使用条件的数量
getView
适配器的。 - 减少您在日志中获取的垃圾收集警告的数量
- 添加滚动功能(限制行数每滚动被刷新)
Answer 3:
一个添加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 !!!
}
});
}
}
你可以找到完整实现在此链接
Answer 4:
//放在调用函数:
@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)
{
}
}
文章来源: Android listview lazy loading