1. 使用ViewHolder模式提高效率
    ViewHolder是利用ListView的缓存机制,避免每次在调用getView()的时候都去通过findViewById实例化控件。使用ViewHolder可以提高50%的效率。Android ViewHolder的作用与用法

  2. 设置项目间分割线

     android:divider="@android:color/gray" android:dividerHeight="10dp"    //设置分割线为透明    android:divider="@null"
  3. 隐藏Listview的滚动条

    android:scrollbars="none"
  4. 取消ListView的Item点击效果

    android:listSelector="#00000000"//使用透明色也可以实现android:listSelector="@android:color/transparent"
  5. 设置ListView显示在第几项

    listView.setSelection(N);//另一种方法:mListView.smoothScrollBy(distance,duration):mListView.smoothScrollOffset(offset);mListView.smoothScrollToPostion(index);
  6. 动态修改ListView

    mData.add("new");//注意mData的对象引用不能被改变,否则adapter不会修改数据
  7. 遍历ListView所有Item

    for(int i=0;i<mListView.getChildCount();i++){            View view = mListView.getChildAt(i);        }
  8. 处理空ListView
    ListView没有数据时,可以使用setEmptyView()方法设置提示。setEmptyView使用
  9. ListView滑动监听
    主要有两种监听ListView滑动事件的方法:OnTouchListener和OnScrollListener。为了更精确的监听滑动事件,还需要使用GestureDetector手势识别、VelocityTracker滑动速度等辅助类。
    OnTouchListener

    mListView.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();
  10. 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判断滑动方向,然后执行相应的动画。判断逻辑和动画代码

  11. 聊天页面的ListView
    Android群英传第四章笔记·ListView使用技巧_第1张图片
    聊天页面也是ListView,只是其Item是两种不同的布局。实现这样的ListView只需要在Adapter中对Item进行判断,不同的类型设置不同的布局即可。可以重写BaseAdapter提供的两个方法:

    @Overridepublic int getItemViewType(int position) {       return type;}@Overridepublic int getViewTypeCount() {return number;}

    聊天消息使用的背景图片是9patch图
    聊天页面实现代码

  12. 动态修改ListView布局
    ListView通常会在点击一个item的时候改变这个item或者其他item的布局样式。一种实现方式是将两种布局写在一起,通过控制布局的显示、隐藏来达到切换布局的效果;另一种是在getView的时候,通过判断来加载不同的布局。
    第二种方式的实现逻辑是:通过listview.setOnItemClickListener获得点击的item的位置position,然后刷新listview的布局,在adapter的getView根据position判断。

更多相关文章

  1. Android 系统音量最大值的定义位置以及默认值的修改方法
  2. 布局(2、相对布局)
  3. android 设置布局为无标题样式
  4. android 去除ScrollVIew拉到尽头时再拉的阴影效果和个别机型的阻
  5. Android 解决布局问题
  6. Android AlertDialog的基本使用方法

随机推荐

  1. Android与PC通过USB连接通信(一)
  2. TextView的drawable属性
  3. Android Support Package
  4. android 获取MAC
  5. Android四种Activity的加载模式
  6. Android - 干货收集。
  7. 视频课程汇总
  8. android流式布局热门标签的实现
  9. android:cacheColorHint,android:listSel
  10. shape .xml