ListView接口函数
函数名 | 作用 |
getChildCount() | 返回屏幕上显示的Item的个数 |
getCount() | 实际上是Adapter.getCount()返回总的item的个数可见不可见都算在内 |
getChildAt(int index) | index从item中显示出来的第一项的下标(下标是指在item中的下标)开始计算 |
getFirstVisiblePosition() | 返回值是当前显示的第一个item的下标(在所有item中的位置) |
getLastVisiblePosition() | 返回值是当前显示的最后一个item的下标(在所有的item中的下标) |
View.getTop() | item距离父控件的top值 |
ListView 获取某个item的高度并计算总高度
- 在listView滚动的时候,根据显示的item的数目,通常会做出相应的导航动画,在使用中,我通过计算listView中item显示的多少,我来设置导航箭头的方向,并在header加载之后进行计算,因为在我的项目中header是在绑定数据之后就会刷新,所以加载header之后计算并不会影响太多的性能,所以在平时使用时需要将计算的方法放在性能影响小的地方
public int calItemHeight(ListView listView){
int totalHeight = 0;
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter == null){
return 0;
}
for(int i = 0, size = listAdapter.getCount(); i < size; i++){
View item = listAdapter.getView(i, null, listView);
item.measure(0, 0);
totalHeight += item.getMeasuredHeight();
}
return totalHeight;
}
ScrollerView与ListView的滑动冲突
- 滑动冲突:子View的滑动事件与父VIew的滑动事件的监听同时触发,ScrollerView和ListView的滑动冲突 导致ListView只会显示一行item
- 解决方案:动态计算listView中的item的高度,再计算总高度
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroller_list_view_conflict);
listView = (ListView)findViewById(R.id.listviewscroll);
String[] arr = {
"a",
"b",
"c",
"d",
"e",
"f",
"g"
};
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.array_item, arr);
listView.setAdapter(arrayAdapter);
setListViewHeightBaseOnChildren(listView);
}
/**
* 动态计算ListView中的item的高度,在计算总高度
* @param listView
*/
public void setListViewHeightBaseOnChildren(ListView listView){
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter == null){
return;
}
int totalHeight = 0;
for(int i = 0, size = listAdapter.getCount(); i < size; i++){
View item = listAdapter.getView(i, null, listView);
item.measure(0, 0);
totalHeight += item.getMeasuredHeight();
}
ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
layoutParams.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
layoutParams.height += 5;
listView.setLayoutParams(layoutParams);
}
ListView.setOnScrollListener()
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.array_item, arr);
listView.setAdapter(arrayAdapter);
listView.setOnScrollListener(new ListView.OnScrollListener() {
/**
* 监听ListView的滑动状态的改变,滑动存在三种状态
* SCROLL_STATE_IDLE:ListView滑动停止 0
* SCROLL_STATE_TOUCH_SCROLL:手指正在拖动ListVIew 1
* SCROLL_STATE_FLING:ListView正在自由滑动 2
* @param view
* @param scrollState
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.d("WJX", "scrollState: "+ scrollState);
}
/**
* @param view
* @param firstVisibleItem:表示屏幕中第一条显示的数据(显示一点也计算在内)在adapter中的位置
* @param visibleItemCount:表示屏幕中显示的数据的数目
* @param totalItemCount:则是在adapter中的总条数
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
Log.d("WJX", "firstVisibleItem:"+firstVisibleItem+" "+"visibleItemCount:"+visibleItemCount+" "+"totalItemCount:"+totalItemCount);
}
});
}
ListView判断滑动位置
- 根据不同长度的ListView绘制引导箭头如果屏幕可以展示出所有的listView那么不需要引导箭头如果一屏显示不全,那么就显示向下的引导箭头如果一屏显示部分,且这部分是最下部的item,那么就需要显示向上的引导箭头
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
View firstVisibleItemView = mListView.getChildAt(0);
if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {
//将箭头资源替换为向下的样式
}
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) {
//将箭头资源替换为向上样式
}
}
}