文章

ListView的使用简介

文章目录

前言

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;

注意:

  1. 初始化/notifyDataSetChanged()时onScroll()有变化
  2. 如果下滑到最后(也就是最后一行)了,一直下滑时onScroll()是没有变化的。

综合上述,结合滚动状态和最后一行状态(isLastRow),可以实现动态加载数据。

ListView选中item

这个很特别,需要适配器先notifyDataSetChanged(),再ListView再setSelection(),要不然会存在选中不中的问题。

 mListViewAdapter.notifyDataSetChanged();
 mListView.setSelection(currentPlayPos);

注意: 也不可以多次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在空数据时显示了一张默认的图片,用来提示用户;而在有数据时,则不会显示。

参考文章

  1. ListView的滚动监听--AbsListView.OnScrollListener的学习
  2. ListView常用优化技巧(Android群英传)
  3. Android群英传
发表评论