Listview 中 getChildAt方法记录


由于项目使用到getChildAt()方法出错,便在此记录,便日后查阅



ListView中getChildAt(index)的使用注意事项

1.原理
在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。

注意:在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的滚动状态使用,一般不滚动时才加载更新数据

//全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示停止滚动 
伪代码
ListView设置 

public int scrollStates; 
class OnScrollListenerImpl implements OnScrollListener{ 
@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
scrollStates = scrollState;  
} 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
int visibleItemCount, int totalItemCount) { 
int lastInScreen = firstVisibleItem + visibleItemCount; 
} 
listView.setOnScrollListener(new OnScrollListenerImpl()); 


Activity中 
if(scrollStates==OnScrollListener.SCROLL_STATE_IDLE){ 

更新视图数据 
} 
以上出自http://ahua186186.iteye.com/blog/1830180


通过getChildAt方法取得AdapterView中第n个Item


 以前对于AdapterView(ListView和GridView的父类)以及这个类的getChildAt()方法理解十分粗浅,以为是指传入一个绝对position(就是这个item是AdapterView第几个元素)来直接获得到该item,当然,android SDK中对于该方法也没有很具体的说明。这个理解是错误的。以简单的listview为例先说下listview对于item的复用,一个元素很多的listview,如果页面的可视区域内最多可以看到6个元素,不妨假如它们的index是0-5,那么在内存中只有6个item对象。当第7个item(即index=6)进入到可视区域的时候,那么其实是在复用index=0的item。由于在滑动时getView这个更新控件的方法执行非常频繁,所以肉眼是丝毫看不出这种复用的。

       那么,接着上面的例子来说,任何情况下,getChildAt(int position)返回的item都是指的可视区域内的第position个元素。下面是一种巧妙和严谨的方法可以在任何时候(指的是listView滑动在任意状态时)根据position取得可视区域内的item,如果该item不在可视区域,则返回null.注:以下代码是从老大那里学习和提取出来的,非笔者原创。

       

[html]  view plain copy
  1. public View getItemView(int position, boolean withOutHeaderViews) {   
  2.         boolean b = withOutHeaderViews && adapterView.getAdapter() instanceof HeaderViewListAdapter;  
  3.         ChildViewInfo childViewInfo = new ChildViewInfo(adapterView);  
  4.         int firstVisiblePosition = b ? childViewInfo.firstVisiblePositionWithOutHeaderViews :   
  5.                 childViewInfo.firstVisiblePosition;  
  6.         int childCount = b ? childViewInfo.childCountWithOutHeaderViews :   
  7.                 childViewInfo.childCount;  
  8.         Integer index = getItemViewIndex(firstVisiblePosition, childCount, position);  
  9.         if (null != index) {  
  10.             index = b ? index + childViewInfo.visibleHeaderViewsCount : index;  
  11.             return adapterView.getChildAt(index);  
  12.         }  
  13.         return null;  
  14.     }  
[java]  view plain copy
  1. private static class ChildViewInfo {  
  2.   
  3.         private Integer firstVisiblePosition = null;  
  4.         private Integer childCount = null;  
  5.   
  6.         private Integer headerViewsCount = null;  
  7.   
  8.         private Integer firstVisiblePositionWithOutHeaderViews = null;  
  9.         private Integer childCountWithOutHeaderViews = null;  
  10.         private Integer visibleHeaderViewsCount = null;  
  11.   
  12.         public ChildViewInfo(AdapterView<Adapter> adapterView) {  
  13.             Adapter adapter = adapterView.getAdapter();  
  14.             firstVisiblePosition = adapterView.getFirstVisiblePosition();  
  15.             childCount = adapterView.getChildCount();  
  16.             if (null != adapter && adapter instanceof HeaderViewListAdapter) {  
  17.                 headerViewsCount = ((HeaderViewListAdapter) adapter).getHeadersCount();  
  18.   
  19.                 firstVisiblePositionWithOutHeaderViews = firstVisiblePosition - headerViewsCount;  
  20.                 if (firstVisiblePositionWithOutHeaderViews < 0) {  
  21.                     firstVisiblePositionWithOutHeaderViews = 0;  
  22.                 }  
  23.   
  24.                 visibleHeaderViewsCount = headerViewsCount - firstVisiblePosition;  
  25.                 if (visibleHeaderViewsCount > 0) {  
  26.                     visibleHeaderViewsCount = Math.min(childCount, visibleHeaderViewsCount);  
  27.                     childCountWithOutHeaderViews = childCount - visibleHeaderViewsCount;  
  28.                 } else {  
  29.                     visibleHeaderViewsCount = 0;  
  30.                     childCountWithOutHeaderViews = childCount;  
  31.                 }  
  32.             }  
  33.         }  
  34.   
  35.     }  
以上出自 http://blog.csdn.net/banking17173/article/details/8253310

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值