ListView常用优化技巧

ListView常用优化技巧

使用ViewHolder模式提高效率

ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化控件。

在自定义Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量。

public final class ViewHolder{

    public ImageView img;
    public TextView title;
}

在getView中这么写:

ViewHolder Holder = null;
if(null == convertView){
    holder = new ViewHolder();
    convertView = inflate(R.layout.viewholder_item,null);
    holder.img = convertView.findViewById(R.id.imageView);
    holder.title = convertView.findViewById(R.id.textView);
    convertView.setTag(holder);
}else{

    holder = (ViewHolder)convertView.getTag();

}

    holder.img.setBackgroundResource(R.drawable.ic_launcher);
    holder.title.setText(sss);
    return convertView;
}

设置项目间分割线

android:divider="@android:color/darker_gray"
android:dividerHeight="10dp"

当想要设置分割线为透明时:
android:divider=”@null”

隐藏ListView的滚动条

android:scrollbars="none"

取消ListView的Item点击效果

android:listSelector="#00000000"

或者用Android自带的透明色来实现这个效果

android:listSelector="@android:color/transparent"

设置ListView需要显示在第几项

ListView以Item为单位进行显示,默认显示在第一个Item,当需要指定具体的Item时,可以通过如下代码来实现

listView.setSelection(N);

还可以通过如下代码来实现平滑移动:

mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);

动态修改ListView

mData.add("new");
mAdapter.notifyDataSetChanged();

遍历ListView中的所有Item

for(int i = 0; i < mListView.getChildCount; i++){
    View view = mListView.getChildAt(i);
}

处理空ListView

在代码中,我们可以通过以下方式给ListView设置空数据时要显示的布局,代码如下所示。

ListView listView = (ListView)findViewById(R.id.listView);
listview.setEmptyView(findViewById(R.id.empty_view));

包含ListView的布局设置如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android">

    <ListView ..../>

    <ImageVIew ...
        android:id = "@+id/empty_view"
    />

</FrameLayout>

ListView滑动监听

  1. OnTouchListener
mListView.setOnTouchListener(new View.onTouchListener(){

    @Override
    public boolean onTouch(View v,MotionEvent event){

        switch(event.getAction()){

            case MotionEvent.ACTION_DOWN:
                //触摸时操作
                break;

            case MotionEvent.ACTION_MOVE:
                //移动时操作
                break;
            case MotionEvent.ACTION_UP:
                //离开时操作
                break;
        }
        return false;
    }

});
  1. OnScrollListener

    mListView.setOnScrollListener(new OnScrollListener(){

    @Override
    public void onScrollStateChanged(AbsListView view,int scrollState){
    
        switch(scrollState){
    
            case OnScrollListener.SCROLL_STATE_IDLE:
                //滑动停止时
                break;
            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                //正在滚动
                break;
            case OnScrollListener.SCROLL_STATE_FLING:
                //手指抛动时,即手指用力滑动
                //在离开后ListView由于惯性继续滑动的状态
                break;
        }
    }
    
    @Override
    public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){
        //滑动时一直调用
    }
    

    });

通过onScroll方法,我们可以得到好多有用的信息。比如:

  1. 判断是不是滚动到最后一行

    if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0){

    }

  2. 可以判断是上滑还是下滑

    if(firstVisibleItem > lastVisibleItemPosition){

    //上滑
    

    }else if(firstVisibleItem < lastVisibleItemPosition){

    //下滑
    

    }
    lastVisibleItemPosition = firstVisibleItem;

ListView还给我们提供了一些封装的方法:

// 获取可见区域内最后一个Item的id
listView.getLastVisiblePosition()
//获取可见区域内第一个Item的id
listView.getFirstVisiblePosition()

ListView的常用拓展

具有弹性的ListView

重写overScrollBy方法,改变maxOverScrollY参数的值,该值默认为0。