Listview刷新位置

发布于 2022-09-02 14:13:37 字数 1763 浏览 29 评论 0

listview在添加新数据后notifyDataSetInvalidated,默认显示是回到第一行,但是习惯的话是显示位置不变,保持在最后一行,在网上找了很多方法,基本都是说记住位置,在notify之后恢复位置,在实际操作以后,在http://stackoverflow.com/questions/3014089/maintain-save-restore-scroll-position-when-returning-to-a-listview里面找到了一个记住位置的方法,亲测有用,恢复位置也很精确。

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());

// ...

// restore index and position
mList.setSelectionFromTop(index, top);

但是却存在一个问题,这个方法不是每一次都有效,有时他还是会回到第一行,具体原因研究了很久也没有找到,不知道有没有人解决过这个问题

这里是我的代码

listview.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

        if (scrollState == SCROLL_STATE_IDLE){
            scrollPosition = lv.getFirstVisiblePosition();
        }
        if (null != list){
            View v = lv.getChildAt(0);
            scrollTop = (v==null)?0:(v.getTop()-lv.getPaddingTop());
        }
        if (null != list &&!list.isEmpty()&&!isrefrash&&isbottom){
           //下载新数据方法
            loadnews();
            //是否正在刷新
            isrefrash = true;
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //根据现实条目判断是否到底部
        if (firstVisibleItem + visibleItemCount == totalItemCount) {
            isbottom = true;
        }else {
            isbottom = false;
        }
    }
});

其中也试过监听是否在滑动,设置在不滑动时才下载新数据,但是也没有用

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

绾颜 2022-09-09 14:13:37

我平常都用notifydatasetchanged,刷新后不改变当前位置

丘比特射中我 2022-09-09 14:13:37

在onScrollStateChanged中判断:

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (lastItem == adapter.getCount() && scrollState == this.SCROLL_STATE_IDLE) {
                    //滑到最后,事件处理
            }
        }
淡莣 2022-09-09 14:13:37

你确定你listView的布局时候 高度撑开了没?我之前遇到的问题是flex布局的时候listView高度没撑开,所以无论我如何向下滑动,都会回到第一行.

宣告ˉ结束 2022-09-09 14:13:37

刷新位置居然是用notifyDataSetChanged就可以了,我之前试居然都不行,我也是懵逼的

两相知 2022-09-09 14:13:37

为啥不用recylerview替代listview

云醉月微眠 2022-09-09 14:13:37

用RecyclerView特别容易就能实现,诶诶。。

问一下listView.setSelectionFromTop(index, top);这个 是在哪里调用的
onResume里面么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文