On the Android ListView listSelector to solve cross-border issues

今天在优化蓝牙的时候,发现老版本的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 :

再做上下滚动,没有出现上述图片里出现的情况:

时间: 2024-10-19 22:09:59

On the Android ListView listSelector to solve cross-border issues的相关文章

Android ListView常见属性问题

Question 1: listview在拖动的时候背景图片消失变成黑色背景.等到拖动完毕我们自己的背景图片才显示出来. 解决办法: xml中: android:scrollingCache="false"  或者 android:cacheColorHint="#00000000" 代码中: setScrollingCacheEnabled(false)  或者 setCacheColorHint(0)  或者setCacheColorHint(Color.TRA

Android——ListView与适配器

Android--ListView与适配器 1.抽屉布局  Drawer <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.

Android ListView getView()方法重复调用导致position错位

问题现状:Android ListView getView()方法重复调用导致position错位 解决办法:把ListView布局文件的layout_height属性改为fill_parent或者match_parent. <ListView android:id="@+id/myphoto_listview" android:layout_width="match_parent" android:layout_height="match_pare

Android ListView圆角

首先来看看ListView 相关基本属性 1.单击列表后,列表的背景变成黑色了.可通过指定android:cacheColorHint的属性来放变它,将它指定为透明.使用下面的属性值: android:cacheColorHint="#000000" 即可. 2.去除列表项中间的分割线:android:divider="#00000000",这里的值也可以指向一个drawable图片对象(android:divider="@drawable/list_li

android listview 触摸改变颜色直至下一次触摸恢复(包含层叠颜色显示)

基本的思路是,在实体类中保存颜色的值或者是保存是否选中的状态(boolean),把实体的类的列表传入BaseAdapter然后调用listview实例的notifyDataSetChanged()方法进行动态更新数据. 包含两种方式(第二种是转的) 下面是一个实例: ListViewItem:实体类 package cn.com.demotest.entity; public class ListViewItem { private String name; private String res

Android——ListView布局+适配器(三)

Android--ListView布局+适配器(三) package com.example.administrator.newstop; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import andro

Android——ListView多布局+适配器(二)

Android--ListView多布局+适配器(二) <span style="font-size:18px;">package com.example.administrator.newstop.entity; /** * Created by Administrator on 2016/8/4. */ public class News { private String title; private String pubDate; private int img; p

Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问

[转]Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件

Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件. 1.为了防止拖动ListView时,在列表末尾重复数据显示.需要加入 HashMap<Integer,View> lmap = new HashMap<Integer,View>();其中Integer为列表位置,View为子项视图,加入数据前首先if (lmap.get(position)==null) ,满足条件时,加入lmap.put(position, convertView