SwipeMenuListView学习笔记和原理、结构浅析

Android官方文档上说,LstView属于AdapterView的子类,而AdapterView是继承自ViewGroup的,所以ListView实际上也是继承自ViewGroup

关于WapperListAdapter,官方文档的解析是 List adapter that wraps another list adapter. The wrapped adapter can be retrieved by calling getWrappedAdapter().


SwipeMenu                 这是一个类似JavaBean的实体类,包含了多个SwipeMenuItem
SwipeMenuItem         这也是一个类似JavaBean的实体类,其中的属性用来设置显示出来的View的样式     
SwipeMenuView         用来将SwipeMenu转化成View,显示侧滑出来的选项栏,实际上是一个LinearLayout
SwipeMenuLayout      包含了ContentView和SwipeMenuView
SwipeMenuCreator     这是一个interface(接口),用于让开发者自己去实现创建SwipeMenu的create()方法
SwipeMenuAdapter    只是一个WrapperListViewAdapter,是对ListView.setAdapter()传进去的adapter进行封装。
SwipeMenuListView

在Activity中,需要实现一个SwipeMenuCreator的实例,重载cerate()方法,而会在SwipeMenuListView.setAdapter()方法中调用这个方法。观察SwipeMenuListView.setAdapter()的实现,会看到里面是将新建了一个SwipeMenuAdapter,同时重载了createMenu方法,并在这个方法中调用了cerate()方法。这就是这个完整的调用过程

另一个需要注意的点是在SwipeMenuLayout定义的几个监听事件中,postInvadate()和this.Invalidate()的区别

同时也可以看出LitstView在上下滑动时会自动调用Invalidate方法,而item的左右侧滑并不会触发ListView的Invalidate,同时,item的自定义View中调用的postInvalidate和this.Invalidate方法都不会触发ListView的Invalidate方法(即onDraw方法不会重复执行)
经过实际测试,在SwipeMenuLayout的监听事件中用 post Invalidate(),可以是整个滑动效果更加平滑,不会有卡顿的现象

关于ListView.getChildAt()有了新的认识, http://ahua186186.iteye.com/blog/1830180
注意:在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项! 

即取值范围在 >= ListView.getFirstVisiblePosition() &&  <= ListView.getLastVisiblePosition(); 
1)所以如果想获取前部的将会出现返回Null值空指针问题; 
2)getChildCount跟getCount获取的值将会不一样(数量多时); 
3 )如果使用了getChildAt(index).findViewById(...)设置值的话,滚动列表时值就会改变了。 
   需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-它,再用getChildAt取值!即getChildAt(position - ListView.getFirstVisiblePosition()).findViewById(...)去设置值 
2.如果想更新某一行数据,需要配合ListView的滚动状态使用,一般不滚动时才加载更新数据 


项目中涉及到的Scroller类和computeScroll()方法,相关介绍如下 
http://blog.csdn.net/qinjuning/article/details/7419207

我们知道想把一个View偏移至指定坐标(x,y)处,利用scrollTo()方法直接调用就OK了,但我们不能忽视的是,该方法本身来的的副作用:非常迅速的将View/ViewGroup偏移至目标点,而没有对这个偏移过程有任何控制,对用户而言可能是不太友好的。于是,基于这种偏移控制,Scroller类被设计出来了,该类的主要作用是为偏移过程制定一定的控制流程(后面我们会知道的更多),从而使偏移更流畅,更完美。

为了易于控制滑屏控制,Android框架提供了 computeScroll()方法去控制这个流程。在绘制View时,会在draw()过程调用该方法。因此, 再配合使用Scroller实例,我们就可以获得当前应该的偏移坐标,手动使View/ViewGroup偏移至该处。其调用过程位于View绘制流程draw()过程中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值