需求:取到listview中指定的item的veiw.
listview的item是可以复用的直接按位置去取是不可能的.因为只有在屏幕显示的item才有自己的view.
这时候可以使用OnScrollListener经过简单的计算取到指定的view.
如何取第10个item的view?
1,取的指定view必须在屏幕中显示
2,取得时候是根据指定view在屏幕中的位置取得(当前屏幕显示的item 从0开始计算,即使有100个item,但是屏幕只能显示10个,最大值就是9)
示例:
//这一个item要取出它的view
int i = 10;
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
LogUtil.d("-------------------------------------------------");
LogUtil.d("firstVisibleItem--->" + firstVisibleItem);//当前第一个可见的item
LogUtil.d("visibleItemCount--->" + visibleItemCount);//当前屏幕中有几个可见的item
//目标出现 i是真实的item位置
if (i == firstVisibleItem + visibleItemCount - 1) {
//取出目标item的view
View childAt = lv.getChildAt(visibleItemCount - 1);
}
//使用item的view做一些效果
if (childAt != null && firstVisibleItem + 1 <= i) {
int top = childAt.getTop();
//当目标出现的时候 才带出特定的view
//scrollTo并不会实际移动view 点击会造成bug 采用属性动画很合适啊!!!
sbBrandHall.setTranslationY(top);
} else if (firstVisibleItem + 1 > i) { //第一条可见item大于目标了,完全展示 因为滑动快的时候取不到值
sbBrandHall.setTranslationY(0);
}
// 如果滑动过快 保证显示和隐藏正常
if (i < firstVisibleItem + visibleItemCount) {
sbBrandHall.setVisibility(View.VISIBLE);
} else {
sbBrandHall.setVisibility(View.GONE);
}
}