笔记·ListView使用技巧
Posted xiang_freedom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记·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的ID mListView.getLastVisiblePosition(); //获取可视区域第一个item的ID mListView.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提供的两个方法:@Override public int getItemViewType(int position) return type; @Override public int getViewTypeCount() return number;
- 动态修改ListView布局
ListView通常会在点击一个item的时候改变这个item或者其他item的布局样式。一种实现方式是将两种布局写在一起,通过控制布局的显示、隐藏来达到切换布局的效果;另一种是在getView的时候,通过判断来加载不同的布局。
第二种方式的实现逻辑是:通过listview.setOnItemClickListener获得点击的item的位置position,然后刷新listview的布局,在adapter的getView根据position判断。
以上是关于笔记·ListView使用技巧的主要内容,如果未能解决你的问题,请参考以下文章
flutter获取listview可视区域的firstIndex和lastIndex,不破坏原有listview
Android群英传笔记——第四章:ListView使用技巧