首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OnScrollListener更新GridView

OnScrollListener更新GridView
EN

Stack Overflow用户
提问于 2014-09-29 08:47:49
回答 2查看 2.2K关注 0票数 1

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

代码语言:javascript
复制
@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));
                }
            }
        });

在我的日志中,当onScrollListener继续侦听卷轴时,if条件times被多次调用。

代码语言:javascript
复制
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方法会被调用..然后,如果用户向上或向下滚动或其他任何方法,不应再次调用!(当然,直到我到达更新列表的末尾为止)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-29 09:17:24

我可以通过增加一些变量来解决这个问题。

代码语言:javascript
复制
        private int previousTotal = 0;
        private boolean loading = true;
        private int visibleThreshold = 5;

并检查以下条件..。

代码语言:javascript
复制
        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;
            }
        }
    });
票数 1
EN

Stack Overflow用户

发布于 2014-09-29 08:54:09

totalDataCount ->变量,它存储api获取的数据的总数。

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

默认情况下, ->布尔值设置为false。

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

此代码将在下面工作:-

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26095857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档