listview下拉刷新和加载更多的优化

最近看项目之前的功能,发现了几个问题:1.就是每次加载更多都回到第一条. 2.另一个问题就是下拉刷新,下拉刷新需要把之前的listview中的内容给清除掉,再获取新的集合,使用addAll()没有问题,但是如果我让workInfoList=resultList.getWorkInfoList();就显示不出来.

第一个问题,好奇的我看了一下代码,发现每次都重新new了一个Adapter,而且还是分页加载,我就不懂了,那分页加载还有什么意义呢?为啥不直接用notifyDataSetChanged()这个方法呢,节约资源,防止内存溢出.再深入的看,所谓的分页加载竟然是每次都是第一页,只是每次请求的条数不同,第一次20条,第二次就40条,虽然这个可以达到分页加载的效果,但是实际上并没有实现.反而浪费用户的流量.

所以我首先把所有的重新定义Adapter的地方删除,改成notifyDataSetChanged(),只给listview设置一次setAdapter.那分页加载就好说了,每次都请求20条,从第一页开始请求,然后请求第二页,判断如果不是第一页也就是加载更多,我就在之前的list基础上使用addAll();方式.这样每次加载更多展示的都是当前浏览的位置,不再是第一条了.

不过后来我又在它之前的基础上考虑了一下,如果每次都重新new一个Adapter呢,如何让listview展示到最后一条呢? 通过setSelection(position);的方式可以将listview设置到指定位置,还有一个是setSelectionFromTop(),该方法可以将位置确定的比较精确,但是需要计算出position距离顶部的位置,已办用setSelection()就可以,如果要求不是很严格的话.

/**
     * Sets the selected item and positions the selection y pixels from the top edge
     * of the ListView. (If in touch mode, the item will not be selected but it will
     * still be positioned appropriately.)
     *
     * @param position Index (starting at 0) of the data item to be selected.
     * @param y The distance from the top edge of the ListView (plus padding) that the
     *        item will be positioned.
     */
    public void setSelectionFromTop(int position, int y) {
        if (mAdapter == null) {
            return;
        }
            if (pageSize > 20) {
                //加载更多,跳到之前的位置
                int position = resultList.size() - 1;
                Log.d(TAG, "onLoadMore: position:"+position);
                pullListView.setSelection(position);
            }
            if (pageSize > 20 && resultList.size() < pageSize) {
                pullListView.setCanLoadMore(false);
            }

2.另一个问题就是下拉刷新,下拉刷新需要把之前的listview中的内容给清除掉,再获取新的集合,使用addAll()没有问题,但是如果我让workInfoList=resultList.getWorkInfoList();就显示不出来,当时很纳闷.

下拉刷新

开始断点,发现workInfoList确实有值,但是为什么不显示呢,再仔细观察,发现如果用=赋值,这样workInfoList的地址就改变了,而Adapter展示的workInfoList还是之前的地址,而这个地址的内容已经清空了,所以没有内容,而使用addAll()是在之前的workInfoList天剑数据,所以地址没有变化,要提醒大家的是,尽量不要用等号给list集合进行复制,这样只是改变了list所指向的地址,之前地址还是没有内容.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值