【问题标题】:OnScrollListener updating GridViewOnScrollListener 更新 GridView
【发布时间】:2014-11-23 14:34:39
【问题描述】:

我有一个网格视图,想在到达列表末尾后更新网格视图中的项目。为了实现这一点,我决定使用 OnScrollListener。但是 OnScrollListener 的行为很奇怪,因为它多次调用我的方法来更新网格视图..

@Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                // TODO Auto-generated method stub

                if (firstVisibleItem + visibleItemCount >= totalItemCount) {
                    // End has been reached
                    // Call method to update

                Log.i("CountShit", String.valueOf(firstVisibleItem) + " + "
                        + String.valueOf(visibleItemCount) + " >= "
                        + String.valueOf(totalItemCount));
                }
            }
        });

在我的日志中,if 条件被多次调用,因为 onScrollListener 一直在听我猜的滚动..

09-29 14:06:10.338: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.353: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.369: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.385: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.400: I/CountShit(23640): 12 + 8 >= 20
09-29 14:06:10.424: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.439: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.455: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.470: I/CountShit(23640): 14 + 6 >= 20
09-29 14:06:10.486: I/CountShit(23640): 14 + 6 >= 20

有没有一种方法,如果我第一次到达列表的末尾,我的 upate 方法被调用..然后如果用户向上或向下滚动或任何不应该再次调用该方法! (直到我到达我更新的课程列表的末尾)。

【问题讨论】:

标签: android gridview onscrolllistener


【解决方案1】:

totalDataCount -> 存储您的 api 获取的数据总数的变量

previousTotal -> 存储前一个总数的变量。默认情况下它设置为零。

正在加载 -> 默认布尔值设置为 false。

在您的活动中声明所有这些变量,而不是在内部类中(下)

此代码将在下面工作:-

public class EndlessScrollListenerUser implements OnScrollListener {
    boolean loading = true;

    public EndlessScrollListenerUser() {}

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        int lastInScreen = firstVisibleItem + visibleItemCount;
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && lastInScreen==totalItemCount && totalDataCount>takeUser && (previousTotal)<totalDataCount) {

            // Your API Call Goes Here after reaching end
            loading = true;
        }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {}
}

【讨论】:

  • 谢谢!你的回答很有帮助
【解决方案2】:

您正在寻找无尽的视野。您必须创建一个无限滚动侦听器并将其应用于 GridView。试试下面的代码;

初始化 GridView 并应用适配器

final GridView g = (GridView) findViewById(R.id.myGrid);
        g.setAdapter(new ImageAdapter(this));
        EndlessScrollListener scrollListener=new EndlessScrollListener(g,new RefreshList() {

            @Override
            public void onRefresh(int pageNumber) {
                System.out.println("On Refresh invoked..");

            }
        });
        g.setOnScrollListener(scrollListener);

EndlessScrollListener

public class EndlessScrollListener implements OnScrollListener {

    private GridView gridView;
    private boolean isLoading;
    private boolean hasMorePages;
    private int pageNumber=0;
    private RefreshList refreshList;
    private boolean isRefreshing;

    public EndlessScrollListener(GridView gridView,RefreshList refreshList) {
        this.gridView = gridView;
        this.isLoading = false;
        this.hasMorePages = true;
        this.refreshList=refreshList;
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (gridView.getLastVisiblePosition() + 1 == totalItemCount && !isLoading) {
            isLoading = true;
            if (hasMorePages&&!isRefreshing) {
                isRefreshing=true;
                refreshList.onRefresh(pageNumber);
            }
        } else {
            isLoading = false;
        }

    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    public void noMorePages() {
        this.hasMorePages = false;
    }

    public void notifyMorePages(){
        isRefreshing=false;
        pageNumber=pageNumber+1;
    }

    public interface RefreshList {
        public void onRefresh(int pageNumber);
    }
}

Source

【讨论】:

  • 嗨,我想你已经从这里复制了这段代码:stackoverflow.com/questions/10923034/endless-gridview
  • 谢谢,我正在寻找这个链接,但找不到,所以从我的项目中复制代码并将其粘贴到这里。现在我可以更新答案中的链接了。
  • @rogerthatcode 很高兴为您提供帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。请参阅:How does accepting an answer work? 了解更多信息
【解决方案3】:

我可以通过添加一些变量来解决问题

        private int previousTotal = 0;
        private boolean loading = true;
        private int visibleThreshold = 5;

并检查以下条件..

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub
            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;
                    pageCount++;
                }
            }
            if (!loading
                    && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
                // End has been reached
                Log.i("CountShit", String.valueOf(firstVisibleItem) + " + "
                        + String.valueOf(visibleItemCount) + " >= "
                        + String.valueOf(totalItemCount));
                // call update method here
                loading = true;
            }
        }
    });

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多