关于开源项目pulltorefresh的一些

开源项目pulltorefresh的下载地址:https://github.com/johannilsson/android-pulltorefresh

上一篇文章中我讲到在看pulltorefresh的时候发现了一个不足之处,在这一篇文章中来举例说明一下比如PullTofreshGridView,当我们要使用这个自定义的GridView,我们先会在xml中去定义布局,这时候你会发现GridView的一些属性不能自动补全,能自定生成的全是LinearLayout的属性,这里说明一下为什么,因为PullTofreshGridView最终继承的是一个LinearLayout,所以在xml中写布局的时候只有那些LinearLayout的属性能自动补全。说到这里你可能以为它会丢失一些GridView的属性,一开始我也这么认为,但是修改了一些不能自动补全的属性值之后发现还是有用的,然后我跟了一下源码,发现在基类里面重写了addview方法,将添加到基类的view全部加到了在基类中创建的子类的view中,上面一句话可能讲的太简短了也太绕了,我再详细解释一下。基类是继承自LinearLayout的抽象类,里面有个抽象方法createRefreshableView,这个抽象方法会由子类来实现返回给基类一个view(例如GridView),在基类的构造函数中会先创建一个FrameLayout,再将上面返回的子类创建的view(例如GridView)addview(这个addview不是我们要说的重写的那个)到这个FrameLayout中,再将这个FrameLayout添加到基类的视图中,也就是说这里有三层嵌套,基类的LinearLayout一层,FrameLayout一层,子类创建的view(例如GridView)一层。这样说了应该能大概明白一些,还不清楚可以去看一下源码,我就接着继续讲了。

我上面发现了基类重写的addview,一开始我以为那个不能自动补全的属性值改了之后还有用的的疑惑就解决了,当时我发现GridView并不会调用addview,我查了一些GridView和Listview一样是AdapterView的子类,而AdapterView的addview是这样的

 @Override
        public void addView(View child) {
            throw new UnsupportedOperationException("addView(View) is not supported in AdapterView");
        }
最后还是回到 createRefreshableView这个方法,其实在这个方法中就已经创建了带那些不能自动补全的属性的Gridview了,我们来看一下这个抽象方法,createRefreshableView(Context,AttributeSet),而这里的AttributeSet参数就已经将布局文件中的属性传递过来了,所以这一步就已经创建了一个完整的GridView(包含哪些不能自动补全的属性)。

最后说一些自己的一些关于pulltorefresh的观点,就我上面做的分析能看到这个项目的视图有三层嵌套,光就ui优化上来讲(少嵌套是在很多地方都能看到的android ui优化的一点)这里可以做优化。还有一点就是我们在用PullTofreshGridView(项目中的下拉刷新的GridView)的时候有些属性不能自动补全这样用着很不习惯也觉得不太方便,当然对于那些高手来说这一点可以忽略,对于我这种比较懒得人来说就很难过,因为很多时候都不会去记住一个属性的全名。以上纯属个人观点,当然也很可能是因为自己能力还不够还没认识到这个开源项目的好。我会去多对比一些同类的开源项目,再将这些收获分享出来。继续!!!!




你可能感兴趣的:(android,UI)