Android群英传第四章笔记·ListView使用技巧
使用ViewHolder模式提高效率
ViewHolder是利用ListView的缓存机制,避免每次在调用getView()的时候都去通过findViewById实例化控件。使用ViewHolder可以提高50%的效率。Android ViewHolder的作用与用法设置项目间分割线
android:divider="@android:color/gray" android:dividerHeight="10dp" //设置分割线为透明 android:divider="@null"
隐藏Listview的滚动条
android:scrollbars="none"
取消ListView的Item点击效果
android:listSelector="#00000000"//使用透明色也可以实现android:listSelector="@android:color/transparent"
设置ListView显示在第几项
listView.setSelection(N);//另一种方法:mListView.smoothScrollBy(distance,duration):mListView.smoothScrollOffset(offset);mListView.smoothScrollToPostion(index);
动态修改ListView
mData.add("new");//注意mData的对象引用不能被改变,否则adapter不会修改数据
遍历ListView所有Item
for(int i=0;i<mListView.getChildCount();i++){ View view = mListView.getChildAt(i); }
- 处理空ListView
ListView没有数据时,可以使用setEmptyView()方法设置提示。setEmptyView使用 ListView滑动监听
主要有两种监听ListView滑动事件的方法:OnTouchListener和OnScrollListener。为了更精确的监听滑动事件,还需要使用GestureDetector手势识别、VelocityTracker滑动速度等辅助类。
OnTouchListenermListView.setOnTouchListener(myTouchListener); View.OnTouchListener myTouchListener = 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; } };
OnScrollListener监听滑动,可实现滚动到底部、滚动方向的判断
mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState){ case SCROLL_STATE_IDLE: //滑动停止时 break; case SCROLL_STATE_TOUCH_SCROLL: //正在滚动 break; case SCROLL_STATE_FLING: //手指离开后,listView由于惯性继续滑动 break; } } /** * * @param view * @param firstVisibleItem 当前能看见的第一个Item的ID(从0开始) * @param visibleItemCount 当前能看见的Item总数 * @param totalItemCount 整个ListView的Item总数 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //滚动时一直调用 //example0:判断是否滚动了最后一行 if(firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0){ //滚动了最后一行 } //example1:判断滚动的方向,成员变量lastVisibleItemPosition用于存储上一次的第一个可见Item if(firstVisibleItem > lastVisibleItemPosition){ //上滑 }else if(firstVisibleItem < lastVisibleItemPosition){ //下滑 } lastVisibleItemPosition = firstVisibleItem; }});
listview也可以直接获得当前可视区域的item ID。
//获取可视区域最后一个Item的IDmListView.getLastVisiblePosition();//获取可视区域第一个item的IDmListView.getFirstVisiblePosition();
ListView常用拓展
1.具有弹性的ListView
让ListView滑动到顶部或者底部的时候仍然会继续往下或往上滑动一段距离,体现弹性的效果。实现方法是重写overScrollBy方法,改变maxOverScrollY值:private static int mMaxOverDistance = 50;private void initView() {//为不同的屏幕分辨率适配相同的滑动距离值 DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); float density = metrics.density; mMaxOverDistance = (int) (density * mMaxOverDistance);}@Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance, isTouchEvent); }
2.自动显示、隐藏titleBar
在ListView向上滑的时候,隐藏标题栏,往下滑的时候,显示标题栏的效果。使用属性动画可以让一个布局显示或者隐藏并带有动画效果。
首先需要给ListView设置一个HeaderView,防止第一个Item被标题栏布局遮住。mListView.addHeaderView(view);
另外需要定义一个mTouchSlop变量用来获取系统认为的最低滑动距离(即超过这个距离,系统就认为是滑动行为)
mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
实现逻辑:先由OnTouchListener或OnScrollListener判断滑动方向,然后执行相应的动画。判断逻辑和动画代码
聊天页面的ListView
聊天页面也是ListView,只是其Item是两种不同的布局。实现这样的ListView只需要在Adapter中对Item进行判断,不同的类型设置不同的布局即可。可以重写BaseAdapter提供的两个方法:@Overridepublic int getItemViewType(int position) { return type;}@Overridepublic int getViewTypeCount() {return number;}
聊天消息使用的背景图片是9patch图。
聊天页面实现代码- 动态修改ListView布局
ListView通常会在点击一个item的时候改变这个item或者其他item的布局样式。一种实现方式是将两种布局写在一起,通过控制布局的显示、隐藏来达到切换布局的效果;另一种是在getView的时候,通过判断来加载不同的布局。
第二种方式的实现逻辑是:通过listview.setOnItemClickListener获得点击的item的位置position,然后刷新listview的布局,在adapter的getView根据position判断。
更多相关文章
- Android(安卓)面试题7
- TabLayout绑定Viewpager后不显示文字
- 通过判断浏览器的userAgent,用正则来判断手机是否是ios(苹果)和Andr
- botoom tab + title bar
- Android(安卓)实现连接MySQL数据库并进行增删改查操作
- android 自定义对话框
- Android(安卓)ListView滑动加载
- Android(安卓)PinyinIME 源码笔记 -- 0. 简介
- Android(安卓)Webview调用系统相册实现多选图片上传