今天在优化蓝牙的时候,发现老版本的ListView listSelector 在做上下滚动的时候出现了越界的情况,经理说要解决这个问题,
不能影响体验,我自己也去玩了下,发现确实很丑,于是就花了点时间解决这个BUG,顺便把解决方法分享一下,希望遇到同
样情况的朋友,可以少走歪路,增加开发效率
我们来看看这个越界情况的截图:
首先是选中任意一个Item,做上下滚动,看看选中色的越界
向上滚动越界,就是不管你向上滚动到哪里,那个橘红色的Item 就一直在 Top 端,就像Excel的置顶一样,很影响体验
向下的
那么,要怎么解决呢?所以要要原因,其实根本原因我也没弄清楚,我想了一个大概的解决办法,就是通过滚动事件来控制这个颜色需要显示和不需要显示的可见范围即可
编写如下代码:
mPhoneBookList.setOnScrollListener(mOnScrollListener); private OnScrollListener mOnScrollListener = new OnScrollListener() { /** * 滚动状态改变时调用 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 //第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) //第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动 // 不滚动时保存当前滚动到的位置 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { // 停止处理 } } /** * 滚动时调用 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 //firstVisibleItem:当前能看见的第一个列表项ID(从0开始) //visibleItemCount:当前能看见的列表项个数(小半个也算) //totalItemCount:列表项共数 int last = visibleItemCount+firstVisibleItem-1; Log.d("Engineer-Jsp", "onScroll() listview选中id:"+mCurrentPosition +"\n当前能看见的第一个列表项:"+firstVisibleItem +"\n当前能看见的列表项个数:"+visibleItemCount +"\n当前能看见的最后一项:"+last +"\n\n*********************************************************************************"); int color = R.color.OrangeRed; if(mCurrentPosition<firstVisibleItem||mCurrentPosition>last){ color = R.color.transparence; } mPhoneBookList.setSelector(color); } };
逻辑思维:既然他不管多靠前或多靠后,它都会显示,那何不把可见范围的ListView 作为listSelector 活动范围,在范围之外的设为不可见,即设置为透明状态
我在代码里给ListView添加滚动事件,让onScroll () 函数来控制listSelector 这样就可以从根本上解决这种Bug
首先说下onScroll () 函数的意义
firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
visibleItemCount:当前能看见的列表项个数(小半个也算)
totalItemCount:列表项总数
AbsListView:不要用到,就不做解释
这里只要把点中的
Item 的Position 放在 firstVisibleItem 前 和 可见列表项最后一项,最后一项的取得是visibleItemCount+firstVisibleItem-1;
因为第一项从0开始,重新烧录apk,push 到 system 之后,完美解决!
测试图片,随机点选一个
Item :
再做上下滚动,没有出现上述图片里出现的情况: