Android群英传第四章笔记·ListView使用技巧

  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的ID
    mListView.getLastVisiblePosition();
    //获取可视区域第一个item的ID
    mListView.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提供的两个方法:

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

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

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

你可能感兴趣的:(android)