【问题标题】:ListView onScroll being called multiple timesListView onScroll 被多次调用
【发布时间】:2015-02-07 11:49:35
【问题描述】:

我知道以前有人问过这个问题,但我认为我真的很接近我的解决方案,因此我希望这样做。 我正在使用 ListView 并用一些数据填充它。现在,当用户到达底部时,我正在尝试用更多数据填充它。只要 ListView 中的项目少于 100 个,这应该会继续。但是当我第一次将其滚动到底部时,下面的代码会立即添加所有数据。我猜我的异步方法有数十次调用会加载更多数据。

@Override
                    public void onScroll(AbsListView absListView, int firstVisibleItem,
                                         int visibleItemCount, int totalItemCount) {
                        scrollTask myscrolltask = new scrollTask();
                        int lastVisibleIndex = absListView.getLastVisiblePosition();

                        if(lastVisibleIndex != totalItemCount - 1)
                        {
                            System.out.print("lastVisibleIndex "+lastVisibleIndex);
                            System.out.print("totalItemCount-1 " + (totalItemCount-1));
                            myscrolltask.cancel(true);
                            return;
                        }
                        if(moreNewsAvailable == 0)
                            return;
                        if(totalItemCount > 75)
                            return;


                        Log.v("Total Item Count", String.valueOf(totalItemCount));
                        int lastItem = firstVisibleItem + visibleItemCount;
                        if(lastItem == totalItemCount && totalItemCount<=75 && moreNewsAvailable==1 && lastVisibleIndex != -1 && totalItemCount!=0)  //Means that you have reached the bottom
                        {
                            Log.v("LastVisibleItemPosition", String.valueOf(lastVisibleIndex));

                            setProgressBarIndeterminateVisibility(true);

                            myscrolltask.execute("");
                        }
                    }

还有吗?如何确保在到达底部时只对 async 进行一次调用?

【问题讨论】:

    标签: java android android-listview android-asynctask onscrolllistener


    【解决方案1】:

    创建一个布尔变量并在任务执行时将该变量设置为真,并在任务完成时再次将该布尔变量设置为真。 检查任务是否正在进行而不是在滚动方法上执行。

    if(!isLoading){
            if(lastVisibleIndex != totalItemCount - 1)
            {
                System.out.print("lastVisibleIndex "+lastVisibleIndex);
                System.out.print("totalItemCount-1 " + (totalItemCount-1));
                myscrolltask.cancel(true);
                return;
            }
            if(moreNewsAvailable == 0)
                return;
            if(totalItemCount > 75)
                return;
            }
    

    【讨论】:

    • 感谢您的帮助。但是现在每次添加新项目时,列表视图都会滚动到顶部。我能做些什么来帮助它?
    • 更改listview附带的相关列表,并在任务完成时调用notifydatasetchanged()
    • 请注意,您没有在任务中设置适配器。你只需要在任务中通知。在初始化列表后设置适配器。
    • 如果适配器被移除或重置,列表视图会重置滚动位置。
    • 那么如果我更改了传入适配器的数组中的值,我不需要重置适配器吗?我只需要通知?对吗?
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 2012-02-27
    • 2015-12-03
    • 2015-09-09
    • 2010-11-13
    • 2014-12-05
    • 2020-06-08
    相关资源
    最近更新 更多