ListView使用技巧

来源:互联网 发布:ie60和ie80知乎 编辑:程序博客网 时间:2024/05/23 21:35

()设置分隔线

ListView默认是有分隔线的,可以通过android:divider=”@null”设置分隔线透明,也可以通过 android:divider和android:dividerHeight来设置分隔线的颜色(图片)和分隔线的高度。

注:分隔线是指每个Item之间的线,ListView高度设置为match_parent时,最后一个Item的后面也有分隔线,ListView高度设置为wrap_content最后一个Item没有分隔线。

()设置滚动条

ListView在滚动时,默认在右边是有滚动条的。可以设置android:scrollbars=”none”来取消滚动条。

()设置item点击效果

点击ListView的Item时,默认会出现一个点击效果。可以设置android:listSelector来改变Item点击的颜色。

()处理空数据时ListView显示的布局

可以通过setEmptyView(View emptyView)设置ListView在空数据显示的布局。

注:setEmptyView加载的emptyView必须与ListView在同一个布局文件中,可以把ListView和emptyView写在FrameLayout中。

()弹性(阻尼)ListView

这个效果有很多种实现方式,下面的方式是非常简单的

只需重写overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)方法,修改maxOverScrollY参数值

参数maxOverScrollY注释:Number of pixels to overscroll by in either direction along the Y axis.

 @Overrideprotected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {    float density = mContext.getResources().    getDisplayMetrics().density;    int mMaxOverScrollY = (int) (density * 50);     return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY,      maxOverScrollX, mMaxOverScrollY, isTouchEvent);}

()ListView加载多种不同Item

只需要重写下面二个方法
int getViewTypeCount():返回不同布局的总数.
int getItemViewType(int position):返回第position个Item是那种类型,返回值必须从0开始,不然就会报错

()ListView和ScrollView冲突
如果ScrollView中存在ListView,那么ListView数据不会展示完全,这时需要重写onMeasure()方法

  @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    int expandSpec = View.MeasureSpec.    makeMeasureSpec(Integer.MAX_VALUE >> 2,            View.MeasureSpec.AT_MOST);    super.onMeasure(widthMeasureSpec, expandSpec);

()触摸事件

setOnTouchListener(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;        }    });

这个方法只要触摸就一直被调用

()滚动事件

setOnScrollListener(new AbsListView.OnScrollListener(){   @Override  public void onScrollStateChanged(AbsListView view, int scrollState) {   switch (scrollState) {       case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:            //滚动停止            break;       case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:            //正在滚动            break;       case AbsListView.OnScrollListener.SCROLL_STATE_FLING:            //手指用力滑动,离开ListView后,由于惯性继续滚动            break;         }  }   @Override   public void onScroll(AbsListView view, int firstVisibleItem,    int visibleItemCount, int totalItemCount){         if (firstVisibleItem + visibleItemCount >= totalItemCount){               //滚动到最后一页"                               }        if (lastVisibleItem > firstVisibleItem) {                //往下滑动                                    } else if (lastVisibleItem <firstVisibleItem){                  //往上滑动                          }            lastVisibleItem = firstVisibleItem;        }    });

onScrollStateChanged()方法:如果没有惯性滚动,会调用两次.如果存在惯性滚动,会调用三次

onScroll()方法:ListView滚动时会一直回调
firstVisibleItem参数:当前能看到的第一个Item(从0开始)
visibleItemCount参数:当前能看到的Item的总数
totalItemCount参数:整个ListView的Item总数

0 0
原创粉丝点击