您的位置:首页 > 移动开发 > Android开发

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

2015-03-09 22:10 483 查看
Android官方文档上说,LstView属于AdapterView的子类,而AdapterView是继承自ViewGroup的,所以ListView实际上也是继承自ViewGroup

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

关于Adapter.getItemViewType的用法,可参考此链接:http://stackoverflow.com/questions/5300962/getviewtypecount-and-getitemviewtype-methods-of-arrayadapter

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的监听事件中用postInvalidate(),可以是整个滑动效果更加平滑,不会有卡顿的现象

关于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()过程中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息