ListView是我们日常使用非常多的控件之一,所以今天给大家分享一下ListView的使用心得。
addHeaderView()和addFooterView()
添加头部和尾部,常用于上拉刷新和下拉刷新等场景中,我们需要在setAdapter()之前调用。
setAdapter()和getAdapter()
设置ListView的适配器,用于提供ListView要展示的数据。注意这里的getAdapter(),当ListView没有头部或者尾部时,返回的adapter为setAdapter中传入的值,否则,返回的adapter为对setAdapter中传进的adapter的封装值HeaderViewListAdapter。这里也可以看出为什么addHeaderView()和addFooterView()必须在setAdapter之前调用,因为在setAdapter的实现中需要判断ListView是否存在HeaderView和FooterView。
setChoiceMode()
设置Listview的选择模式,默认为CHOICE_MODE_NONE,可以设置为CHOICE_MODE_SINGLE(单选),CHOICE_MODE_MULTIPLE(多选)。如果设置为单选和多选模式,ListView会去记录每个Item的Checked状态,当item被点击时,该item会自动改变该item的Checked状态。如果我们的Item View需要根据Checked状态改变显示,那么该Item View需要implements Checkable,具体实现可以参考CheckedTextView。
isItemChekced()和getCheckedItem()
当Listview设置了单选或者多选模式时,我们可以通过该接口知道哪些Item被选择了。
setItemChecked()
当Listview设置了单选或者多选模式时,可以手动设置某个item被checked。
setSelection()和setSelectionFromTop()
可以通过该接口来设置ListView的滚动位置,我们知道ListView中getScrollY()无法正确获取到ListView当前的滚动距离,并总是返回0.所以当我们需要滚动到某一位置时,可以根据item所在的position来控制滚动的距离。
smoothScrollToPosition()和smoothScrollToPositionFromTop()
该接口与setSelection()和setSelectionFromTop()的功能类似,只是滚动的效果不一样,该滚动效果比较平缓。
getFirstVisiblePosition()和getLastVisiblePosition()
该接口可以获取到ListView当前显示区域中第一个显示的item所在位置和最后一个显示的Item所在位置。
常用使用场景:保存当前ListView的滚动距离,当离开该页面再返回显示ListView时,仍显示的是上一次停留的位置。
/**
* 获取ListView的滚动距离
* @param listView
* @return
*/
Pair<Integer, Integer> getListViewScrollY(ListView listView) {
int position = listView.getFirstVisiblePosition();
int top = listView.getChildAt(0).getTop();
return Pair.create(position, top);
}
/**
* 滚动ListView到指定的位置
* @param listView
* @param posAndTop
* @param smoothScroll
*/
void setScrollY(ListView listView, Pair<Integer, Integer> posAndTop, boolean smoothScroll) {
final int position = posAndTop.first;
final int top = posAndTop.second;
if (smoothScroll) {
listView.setSelectionFromTop(position, top);
} else {
listView.setSelectionFromTop(position, top);
}
}
网友评论