《Android群英传》读书笔记(2)第四章:ListView常用优化技巧

来源:互联网 发布:淘宝在线登录 编辑:程序博客网 时间:2024/05/16 17:38

1.使用ViewHolder模式提高效率

ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次调用getView()时都去通过findViewById()实例化控件
使用ViewHolder非常简单,只需要在自定义的Adapter中定义一个内部类,并将布局中的控件作为成员变量,代码如下:

public final class ViewHolder{    public ImageView img;    public TextView text;}

然后在getView()方法中通过视图缓存机制重用即可:

@Overridepublic View getView(int position,View convertView,ViewGroup parent){    ViewHolder holder = null;    //先判断convertView是否为null        holder = new ViewHolder();        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item.xml,null);        holder.img = (ImageView)convertView.findViewById(R.id.img);        holder.text = (TextView)convertView.findViewById(R.id.text);        convertView.setTag(holder);    }else{        holder = (ViewHolder)convertView.getTag();    }    holder.img.setBackgroundResource(R.drawable.ic_launcher);    holder.text.setText(mData.get(position));    return convertView;}

2.设置项目分割线

使用如下代码为ListView设置分割线

android:divider="@android:color/darker_gray"android:dividerHeight="10dp"//把分割线设置为透明android:divider="@null"

同样也可以设置drawable资源为分割线。

3.隐藏ListView的滚动条

android:scrollbars="none"

4.取消ListView的点击效果

android:listSelector="#00000000"

5.设置ListView需要显示在第几项

listView.setSelection(position);

这个方法类似于scrollTo()是瞬间完成移动的,可以使用下面的代码完成平滑移动:

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

6.动态修改ListView

mDatas.add("new");adapter.notifyDataSetChanged();

要注意的是mDatas必须指向和Adapter中引用的相同的mDatas。

7.遍历ListView中所有的item

for(int i = 0;i < mAdapter.getItemCount();i++){    View item = mListView.getChildAt(i);}

8.处理空的ListView
当ListView中的数据为空时可以通过setEmptyView()方法来指定无数据时的提示:

<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=".MainActivity">    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="match_parent"/>    <ImageView        android:id="@+id/empty_view"        android:src="@mipmap/ic_launcher"        android:layout_width="match_parent"        android:layout_height="match_parent"/></FrameLayout>

上面是布局文件
在代码中可以通过以下方式设置emptyView:

listView.setEmptyView(findViewById(R.id.empty_view));

9.ListView滑动监听

有两种方式来实现滑动监听分别是onTouchListeneronScrollListener
(1)onTouchListener实现
通过监听onTouchListener中的ACTION_DOWN、ACTION_MOVE、ACTION_UP三个事件来判断滑动状态:

mListView.setOnTouchListener(new View.onTouchListener(){    @Override    public boolean onTouch(View v,MotionEvent event){        String action = event.getAction();        switch(action){            case MotionEvent.ACTION_DOWN:                //触摸时操作                break;            case MotionEvent.ACTION_MOVE:                //移动时操作                break;            case MotionEvent.ACTION_UP:                //离开时操作                break;            default:                break;        }        return true;    }});
(2)`onScrollListener()`实现onScrollListener是AbsListView中的监听事件,封装了很多与ListView相关的信息,下面是一般用法:
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:                //手指抛动时                break;            default:                break;        }    }    @Override    public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){        //滚动时调用        if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0){            //滑动到最后一行        }        if(firstVisibleItem > lastVisibleItemPosition){            //上滑        }else if(firstVisibleItem < lastVisibleItemPosition){            //下滑        }    }});
0 0
原创粉丝点击