前言
ListView翻译为[列表],是一个非常重要的显示布局,也常用的布局。
不过,在Android 5.X以后,RecyclerView开始取代ListView,但ListView的使用还是很多。
它的相关的View有GridView和RecyclerView。
下面我们只整理ListView的常用,适配器那块没有整理。
ListView的使用
现在项目中还是有使用ListView来展示信息,因此有必要整理一下。
监听滚动和动态加载
需要设置setOnScrollListener监听,实现的方法有如下:
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
//滚动动画还在
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//还在触摸,在滚动
break;
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
//没有滚动
break;
}
}
scrollState有三种状态:
- SCROLL_STATE_TOUCH_SCROLL:开始滚动的时候调用,调用一次
- SCROLL_STATE_IDLE:滚动事件结束的时候调用,调用一次
- SCROLL_STATE_FLING:当手指离开屏幕,并且产生惯性滑动的时候调用,可能会调用<=1次
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//isLastRow 表示刷新到最后一行
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
isLastRow = true;
} else {
isLastRow = false;
}
}
在滑动屏幕的过程中,onScroll方法会一直调用:
- firstVisibleItem: 当前屏幕显示的第一个item的位置(下标从0开始)
- visibleItemCount:当前屏幕可以见到的item总数,包括没有完整显示的item
- totalItemCount:Item的总数,** 包括通过addFooterView添加的那个item
下面代码可以判断滑动方向
if(firstVisibleItem > lastVisibleItem){
// 上滑
}else if(firstVisibleItem < lastVisibleItem){
// 下滑
}
lastVisibleItem = firstVisibleItem;
注意:
- 初始化/notifyDataSetChanged()时onScroll()有变化
- 如果下滑到最后(也就是最后一行)了,一直下滑时onScroll()是没有变化的。
综合上述,结合滚动状态和最后一行状态(isLastRow),可以实现动态加载数据。
ListView选中item
这个很特别,需要适配器先notifyDataSetChanged(),再ListView再setSelection(),要不然会存在选中不中的问题。
mListViewAdapter.notifyDataSetChanged();
mListView.setSelection(currentPlayPos);
mListViewAdapter.notifyDataSetChanged();
//固定选中第二行,行高98,根据Item高改的
mListView.setSelectionFromTop(position, 98);
注意: 也不可以多次notifyDataSetChanged()要不然也有问题。
遍历ListView中的所有item
ListView作为一个ViewGroup,为我们提供了操纵子View的各种方法,最常用的就是通过getChildAt()来获取第i个子View,代码如下:
for (int i = 0, len = mListView.getCheckedItemCount(); i < len; i++) {
View view = mListView.getChildAt(i);
}
处理空ListView
ListView用于展示列表数据,但当列表中无数据时,ListView不会显示任何数据或提示,按照完善用户体验的需求,这里应该给以无数据的提示。幸好,ListView提供了一个方法——setEmptyView(),通过这个方法,我们可以给ListView设置一个在空数据下显示的默认提示
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.blankj.listviewskill.MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:listSelector="@android:color/transparent"
android:paddingBottom="40dp"/>
<ImageView
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"/>
</FrameLayout>
在代码中,我们通过以下方式给ListView设置空数据时要显示的布局,代码如下所示。
mListView.setEmptyView(findViewById(R.id.empty_view));
通过以上代码,就给ListView在空数据时显示了一张默认的图片,用来提示用户;而在有数据时,则不会显示。