欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android-pulltorefesh快速开发框架的使用小结

程序员文章站 2022-05-14 10:03:34
...

在项目中需要支持刷新加载功能,如果你牛逼,你完全可以直接自己写一个自定义的控件,支持刷新,如果你是菜鸟,呵呵呵。。。那就用框架吧,其实框架就是别人写好的代码,提供了一种解决方法,我们只需要知道如何使用它,把数据放进去,获取。。。当然,有时间你可以看源码,大神是如何实现的。。。

框架是大神写的,但是大神也是人,也会有犯错的时候,可能错误不大,但是我们写项目就不能犯错,要不然老板干你。。。滚蛋。。。
在集成开源框架android-pulltorefesh,发现存在很多bug以及一些不满好的设计,做个总结吧,请不要吐槽。。。
导入项目:
https://github.com/chrisbanes/Android-PullToRefresh
这个项目比较老了,
README.md Update README to notify you of me no longer maintaining project 4 years ago
最近一次修改在4年前。
所以项目是ecplice做的,用ecplice导入。
4个文件:
library 库,最重要的
PullToRefreshListFragment 库 (依赖library)
PullToRefreshViewPager 库(依赖library)

LauncherActivity_sample 启动项目,需要上面3个库

ecplice导入有的时候报错,提示override
在实际应用中应该注意的一点就是:
在eclipse中,compiler 都得设置到1.6。这包括preference->Java->compiler 下要改成1.6, 同时,project里的build path 里jdk 也得改成1.6。 这主要是针对同时装了1.5, 1.6,而default is 1.5这种情况的。
http://blog.csdn.net/lxzo123/article/details/6451265

1、目前支持的view


    ListView
    ExpandableListView
    GridView
    WebView
    ScrollView
    HorizontalScrollView
    ViewPager

没有RecycleView,蛋疼,如果项目需要,你可以自己写一个,模仿GridView。。。

2、发现的下拉刷新bug
1)
android-pulltorefesh快速开发框架的使用小结
步骤:
PullToRefreshListView 下
设置支持同时支持上拉和下拉模式(设置图标旋转rotate),下拉刷新状态中在
没有刷新结束时将listview快速滑动到下面,不断的上拉。这个时候再滑动到 头部会发现一直在刷新,永远不会停止,除非你重新(上拉或者下拉)刷新,才会停止!!!

我的解决方法:
如果你项目要支持上拉下拉刷新,代码里面在上拉刷新时候,重新设置模式为只支持上拉,
在下拉时候,代码设置只支持下拉,
在刷新结束时候,重置,支持 上拉下拉刷新。
核心:
主要就是在一个刷新状态下(下拉),只有刷新结束,才可以再次另一种方式刷新(对应上拉)。

2)
设置图标旋转rotate模式,下拉刷新,再往上滑动,刷新view消失,再往下滑动,发现华为mate8手机下,rotate旋转图标不转动,停止了,就是说没有动画!!!

我的解决方法:rotate 旋转是用代码写的,可以修改库bug。
或者使用另一个动画效果,箭头,那这个旋转应该是xml写的旋转,不存在问题。

3)
刷新状态无法关闭,一直在刷新。。。
网上解决方案延迟执行刷新完成操作,太快了执行onRefreshComplete无效,真特么无语。。。

解决方法:

PullToRefreshListView 实现下拉或者上拉加载时候,可能在上拉 完成时候,调用onRefreshComplete方法去

停止 刷新操作,但是,可能无效,测试产生原因,刷新获取数据时候,时间太短,就会出现该问题



我们可以 延迟 1秒左右,在调用onRefreshComplete 方法,可以解决该问题


mListView.postDelayed(new Runnable() {

            @Override
            public void run() {
                mListView.onRefreshComplete();
            }
        }, 1000);


记得是在 setadpter后面执行,不然 无效

源码:

    @Override
        protected String[] doInBackground(Void... params) {
            // Simulates a background job.
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
            }
            return mStrings;
        }

你特么延迟了4s,见鬼。。。

4)
web、gridview、scrollview (好像只有除了listview)。。。
mPullRefreshScrollView.setScrollingWhileRefreshingEnabled(true);
设置刷新时,支持滑动。但是发现滑动时候 头部或者底部刷新view还在,尼玛,屏幕本来就小,为什么不隐藏???
设置无效,只有
ptrListViewExtrasEnabled
针对 listview才起效果!!!!

5)
使用PullToRefreshListView 获取count 遇到的坑!!!!

 favorite_listview = (PullToRefreshListView) findViewById(R.id.favorite_listView);
    favorite_listview.setScrollingWhileRefreshingEnabled(true);
    //刷新分页
    favorite_listview.setMode(PullToRefreshBase.Mode.BOTH);
    listview = favorite_listview.getRefreshableView();

发现listview中的 item
=0时候,count=0;
有1条的时候,
listview.getCount()打印
log
06-21 18:26:23.489 19267-19267/? D/FavoriteActivity: FavoriteActivity—listview—3 ;

2条—listview.getCount() =4 ;
那么代码设计应该是获取listview的count=0,
把头部、底部刷新view加载外层,不在listview中!!!
如果count>0,
把头部、底部分别加载
listview的第一行 和 最后一行(这就是为什么size多2个的原因,并且即使清空了listview.clear( ),头尾也不消失)
android.widget.FrameLayout:
头刷新view
FavoriteActivity—listview—android.widget.FrameLayout{ba1807c V.E…… ……ID 0,0-1062,0}

06-21 18:53:16.565 28916-28916/? D/FavoriteActivity: FavoriteActivity—listview—android.widget.LinearLayout{4d1ad05 V.E….L. …….. 0,0-1062,414 #7f0f0065 app:id/list_item}

尾部刷新view
06-21 18:53:16.566 28916-28916/? D/FavoriteActivity: FavoriteActivity—listview—android.widget.FrameLayout{6dc615a V.E…… ……ID 0,414-1062,414}

…….

解决方法:
模仿PullToRefreshListView,应该可以实现gridview刷新隐藏头部view
,后期试试吧~~~

框架可能还有其他问题,反正就是用到真正项目中,有很多问题出现,需要修复。。。
改啊。。。

3、各种属性设置(繁琐,草)

常用的一些属性:

ptr:ptrMode="both"  
设置上拉和下拉都支持。
    可选值为:disabled(禁用下拉刷新), 
pullFromEnd(仅支持上拉刷新), 
both(二者都支持), manualOnly(只允许手动触发)
    也可以使用代码设置,在onCreate里面写:mPullRefreshListView.setMode(Mode.BOTH);//设置你需要的模式

设置图标    
ptr:ptrDrawable="@drawable/ic_launcher"

设置下拉时候图标的动画    
ptr:ptrAnimationStyle="flip" 倒置、ptr:ptrAnimationStyle="rotate"旋转

ptrRefreshableViewBackground 
设置整个mPullRefreshListView的背景色

ptrHeaderBackground 
设置下拉Header或者上拉Footer的背景色

ptrHeaderTextColor 
用于设置Header与Footer中文本的颜色

ptrHeaderSubTextColor 
用于设置Header与Footer中上次刷新时间的颜色

ptrShowIndicator 
如果为true会在mPullRefreshListView中出现icon,
右上角和右下角,看着蛋疼。。。

ptrHeaderTextAppearance , 
ptrSubHeaderTextAppearance
分别设置拉Header或者上拉Footer中字体的类型颜色等等。

ptrRotateDrawableWhilePulling 
当动画设置为rotate时,下拉时候是否旋转。
这个无法理解,搞不清,rotate就是让他旋转,
你特么还设置不转???

ptrScrollingWhileRefreshingEnabled 
刷新的时候,是否允许ListView或GridView滚动

ptrListViewExtrasEnabled 
决定了Header,Footer以何种方式
加入mPullRefreshListView,
true为headView方式加入,
就是滚动时刷新头部会一起滚动,
就是所刷新的view会隐藏,但是
这个只针对ListView有效果。

4、
想自定义刷新的view,使用自己的layout.xml,这个貌似无法实现,除非直接修改library,框架写死了布局,只给了
设置图标、
提示文字这些方法、字体等方法。