baseAdapter icon indicating copy to clipboard operation
baseAdapter copied to clipboard

加载完成,空数据时,隐藏加载布局,解决办法

Open lfei1789 opened this issue 9 years ago • 7 comments

感谢大神的分享,同时希望这个方法能帮助到有用的人 1、LoadMoreWrapper 中定义一个boolean类型变量 2、在展示界面,判断该变量的值,如果还有数据设置true,如果没有设置为false 3、在LoadMoreWrapper 中,getitemCount方式,中返回数量时判断, hasLoadMore()方法和这个参数一起判断,是否 +1

lfei1789 avatar Sep 02 '16 08:09 lfei1789

贴个代码下

zzq5636243 avatar Oct 08 '16 10:10 zzq5636243

@lfei1789 若是完全依照你的描述进行修改是会崩溃的,我尝试了很多次之后,在界面中设置boolean之后,需要再mLoadMoreWrapper.notifyItemRangeRemoved(list.size(), list.size()+1);这样才不「勉强」完成了移除加载更多的布局。我贴一下我的代码,希望帮助到同样困惑的人。

// 我重写了LoadMoreWrapper,源代码中没有变动过的地方我都省略了,方便你去寻找。
public class MyLoadMoreWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

 /*代码省略*/

 // 这个是定义的是否加载完成的boolean变量
private boolean mIsLoadOver = true;

// 给一个set方法,用于在外部控制是否隐藏‘加载更多’
public void setLoadOver(boolean loadOver) {
    mIsLoadOver = loadOver;
}

/*代码省略*/

@Override
public int getItemCount() {
    // 这里将mIsLoadOver 和 hasLoadMore()一起判断
    return mInnerAdapter.getItemCount() + ((hasLoadMore() && mIsLoadOver) ? 1 : 0);
}

/*代码省略*/

修改完之后呢,在界面中判断是否加载完数据的地方

mLoadMoreWrapper.setLoadOver(false);

mLoadMoreWrapper.notifyItemRangeRemoved(List.size(), List.size() + 1)

这样就实现了移除‘加载更多的布局’。


PS:有一个不大不小的缺陷就是当加载完成之时,‘加载更多的布局‘会消失掉,然后页面会整体向下移动一段距离,填满刚刚‘加载更多的布局‘的位置。也就是移除一个Item之后整个RecyclerView会有一个向下的动画效果。 PPS:希望可以帮到需要帮助的人~

2ivy avatar Oct 26 '16 07:10 2ivy

thx,根据 @2ivy 的方法解决了问题,bty感觉这个项目不怎么更新。。。issue下面好多问题

cellzer avatar Nov 24 '16 06:11 cellzer

还有就是数据不足一页同样的问题 但在Adapter没法拿到lastView.getBottom 去判断 我只能想到重写或者监听RecyclerView

cinita-ms avatar Nov 24 '16 08:11 cinita-ms

setLoadMoreView(null)

lalozhang avatar Dec 19 '16 02:12 lalozhang

我的做法是: 当有下一页时,“加载”不需要移除,并且会自动加载下一页数据 相当于“加载”存在但看不见,看见时会加载下一页 当没有下一页时,设置null&&0 所以只需要在接口返回的地方加上如下 PAGE_SIZE是请求的list的条数

mLoadMoreWrapper.setRefreshing(list.size() < PAGE_SIZE);

重写LoadMoreWrapper,在最后加上

public void setRefreshing(boolean refreshing){
        if(refreshing){
                setLoadMoreView(LAYOUT_DEFAULT);
        }else{
            setLoadMoreView(null);
            setLoadMoreView(0);
        }
    }

因为不改加载的布局,所以用了常量LAYOUT_DEFAULT

palmyer avatar Jan 10 '17 07:01 palmyer

当加载到最后一页或者内容为空的时候,调setAdapter将adapter设置为mAdapter

ghost avatar Jan 11 '17 02:01 ghost