0
点赞
收藏
分享

微信扫一扫

ListView使用总结(一)


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使用总结(一)_数据

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()) {
//将箭头资源替换为向上样式
}
}
}


举报

相关推荐

0 条评论