Android:为Android Market等无尽列表实现进度条和“加载...”

时间:2011-01-12 09:24:29

标签: android android-listview

从Android Market获取灵感,我已经实现了一个无限列表,当我们到达列表末尾时,它会从服务器加载更多数据。

现在,我需要实施进度条& “正在加载..”文字显示为alt text

从中获取灵感的示例代码会很棒。

3 个答案:

答案 0 :(得分:5)

这是一个解决方案,可以在ListView加载时轻松显示加载视图。

您可以在此处查看课程:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - Helper使得可以使用这些功能而无需从SimpleListViewWithLoadingIndicator扩展。

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java - 当用户即将到达ListView的底部时,监听器开始加载数据。

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java - EndlessListView。您可以直接使用此类或从中扩展。

答案 1 :(得分:2)

向ListView添加onScrollListener。当用户滚动时,检查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 !!!
                }
            });
        }
    }

您可以找到完整的实施at this link

答案 2 :(得分:1)

这里的其他答案是过时的,未维护的解决方案。但是,这篇文章似乎是最新的: https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView

在SO答案中有太多的东西要写,但是在我编写此答案时,有一些重要的地方:

RecyclerView实施无休止的分页需要执行以下步骤:

  1. EndlessRecyclerViewScrollListener.java复制到您的应用程序中。
  2. addOnScrollListener(...)上调用RecyclerView以启用无穷大的分页。传入EndlessRecyclerViewScrollListener的实例并实现onLoadMore,它在需要加载新页面以填充列表时会触发。
  3. 在上述onLoadMore方法中,通过发送网络请求或从其他来源加载将其他项目加载到适配器中。

要开始处理步骤2和3的滚动事件,我们需要在addOnScrollListener()Activity中使用Fragment方法,并传递{{1}的实例},如下所示:

EndlessRecyclerViewScrollListener