1.项目中用到了瀑布流,之前用的是PinterestLikeAdapterView这个控件 然后上拉加载更多跟下拉刷新用的是XListView ,但是加载更多或者下拉刷新的时候闪屏,对用户体验很不好, 于是又从网上找了一些demo,最后决定用StaggeredGridView控件
PinterestLikeAdapterView控件github 点击下载
StaggeredGridView控件github 点击下载
我参考的是StaggeredGridView+PullToRefresh实现的:点击下载
2.问题:下载下来集成到项目中,发现上拉刷新的时候,没有更新数据,调用刷新完成方法,底部没有隐藏,并且继续加载更多不会调用加载更多监听函数。
3.任何问题出现都是由原因的,跟踪源码,发现问题所在。
1).在StaggeredGridView类trackMotionScroll方法中有对某个boolean类型值进行判断,发现loadlock为false的时候,加载更多函数才会调用。
源码如下:
- if (!loadlock) {
- mLoadListener.onLoadmore();
- loadlock = true;
- }
2).在更新适配器的时候会判断是否有更新数据,有更新数据loadlock才会设置成false.否则一直是true,会导致一直调用不了。代码在StaggeredGridView类中内部类AdapterDataSetObserver类的onChanged方法中,代码太多我就不贴出来了。
4.进行解决
1).在StaggeredGridView类中增加了两个方法,隐藏底部跟现实底部
- public void hideFooterView(){
- if(mFooterView.getVisibility()==View.VISIBLE){
- StaggeredGridView.LayoutParams lp = new StaggeredGridView.LayoutParams(0);
- mFooterView.setLayoutParams(lp);
- mFooterView.setVisibility(View.GONE);
- }
- }
- public void showFooterView(){
- if(mFooterView.getVisibility()==View.GONE)
- mFooterView.setVisibility(View.VISIBLE);
- StaggeredGridView.LayoutParams lp = new StaggeredGridView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT);
- lp.span = Integer.MAX_VALUE;
- mFooterView.setLayoutParams(lp);
- oadlock=false;
- }
2).加载更多或者下拉刷新的时候判断是否是最后一页,最后一页的话隐藏底部 否则显示底部
- if(page==3){//假如第三页是最后一页,隐藏下拉刷新
- ptrstgv.getRefreshableView().hideFooterView();
- }else{
- mAdapter.getMoreItem();
- mAdapter.notifyDataSetChanged();
- ptrstgv.getRefreshableView().showFooterView();
- page++;
- }
效果图如下: