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

来源:互联网 发布:淘宝最近怎么了 编辑:程序博客网 时间:2024/05/18 20:08

最近看项目之前的功能,发现了几个问题: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所指向的地址,之前地址还是没有内容.