Android 获取listview中Item的可视百分比
来源:互联网 发布:微信天猫购物群软件 编辑:程序博客网 时间:2024/06/06 12:32
需求: 做新闻埋点上报的时候有种上报叫展现上报。服务端要求当新闻展现超过50%后才算展现,手指做了抛的动作(手指离开屏幕前,用力滑了一下)这种在listview中显示的不算展现。
猛的一看,实现太难了,后来发现函数
public final boolean getLocalVisibleRect(Rect r)
获取View的可视区域,比如listView 最顶层的ItemView显示一半,通过函数的到Rect(0, 60 - 1080, 120)
0 和 1080 是itemView的left right
60 和 120 是itemView的top bottom
如果显示全 itemView的top就是0。
如果是最低层的itemView显示一点,通过函数得到的Rect(0, 0 - 1080, 21)
top为0,说明上面没有覆盖,
bottom为21,说明下面覆盖了(120-21)个点
所以计算显示百分比的函数
public int getVisibilityPercents(View view){ View tv = view; tv.getLocalVisibleRect(rect); int height = tv.getHeight(); int percents = 100; if(rect.top==0 && rect.bottom == height){ percents = 100; }else if(rect.top > 0){ percents = (height - rect.top) * 100 / height; }else if(rect.bottom > 0 && rect.bottom <height) { percents =rect.bottom * 100 / height; } return percents; }
listview的滑动事件有三个
SCROLL_STATE_IDLE = 0; 停止滚动
SCROLL_STATE_TOUCH_SCROLL = 1; 正在滚动
SCROLL_STATE_FLING = 2; 惯性滑动
惯性滑动的时候展现的新闻不算展现,也就是说,在SCROLL_STATE_IDLE的时候计算整个屏幕的itemView的展现百分比,在SCROLL_STATE_TOUCH_SCROLL的时候,只计算最下面itemView的百分比就好。
关键代码:
public class DataListItem extends Object{ public String mTitle; public Rect rect = new Rect(); public DataListItem(String title){ mTitle = title; } public int getVisibilityPercents(View view){ View tv = view; tv.getLocalVisibleRect(rect); int height = tv.getHeight(); int percents = 100; if(rect.top==0 && rect.bottom == height){ percents = 100; }else if(rect.top > 0){ percents = (height - rect.top) * 100 / height; }else if(rect.bottom > 0 && rect.bottom <height) { percents =rect.bottom * 100 / height; } return percents; }}
for (int i = 0; i < 50; i++) { mArrayList.add(new DataListItem("" + i)); } mMyAdapter = new MyAdapter(getBaseContext().getApplicationContext(), mArrayList); mListView.setAdapter(mMyAdapter); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调 //回调顺序如下 //第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 //第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) //第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动 //当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1; //由于用户的操作,屏幕产生惯性滑动时为2 mScrollState = scrollState; Log.d("onScrollStateChanged","scrollState = " +scrollState ); Log.d("onScrollStateChanged", "view.getFirstVisiblePosition() = " +view.getFirstVisiblePosition() +"view.getLastVisiblePosition() = "+view.getLastVisiblePosition() ); if(mScrollState == 0){ for (int i = view.getFirstVisiblePosition(),j=0;i<=view.getLastVisiblePosition();i++,j++){ View v = view.getChildAt(j); if(v==null)return; DataListItem d = mArrayList.get(i); int percents = d.getVisibilityPercents(v); Log.d(TAG ,d.mTitle +" "+percents+"%"); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 //firstVisibleItem:当前能看见的第一个列表项ID(从0开始) //visibleItemCount:当前能看见的列表项个数(小半个也算) //totalItemCount:列表项共数 Log.d("onScroll", "firstVisibleItem = " + firstVisibleItem + " visibleItemCount = " + visibleItemCount + " totalItemCount = " + totalItemCount); if(mScrollState == 0){ for (int i = firstVisibleItem ,j=0;i<visibleItemCount;i++,j++){ View v = view.getChildAt(j); DataListItem d = mArrayList.get(i); int percents = d.getVisibilityPercents(v); Log.d(TAG ,d.mTitle +" "+percents+"%"); } }else if(mScrollState == 1){ DataListItem d = mArrayList.get(firstVisibleItem); View v = view.getChildAt(0); int percents = d.getVisibilityPercents(v); Log.d(TAG ,d.mTitle +" "+percents+"%"); d = mArrayList.get(firstVisibleItem +visibleItemCount-1); v = view.getChildAt(visibleItemCount-1); percents = d.getVisibilityPercents(v); Log.d(TAG ,d.mTitle +" "+percents+"%"); } } });
0 0
- Android 获取listview中Item的可视百分比
- Android 获取ListView中某个item的游标Cursor
- Android 在ListView中获取item高度
- ListView 请求(加载)可视区域Item的图片
- Android中ListView组件的Item拖动
- android listView 中Item的高度设置
- [Android]ListView中item的重用
- Android listView 中嵌套不同的item
- Android listView 中嵌套不同的item
- ListView中获取item值
- 获取ListView中点击Item
- ListView 中Item 位置获取
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 封装的不错的解析http 命令参数的c++ 源码
- JavaScript模式 For和For-in循环优化
- kernel 3.10内核源码分析--内核栈及堆栈切换
- layoutSubviews何时调用的问题
- c++作业2
- Android 获取listview中Item的可视百分比
- 信息收集
- exit()和_exit()函数
- 16.04.01
- git代码托管平台
- 从土木到IT——搬砖男的一点经历(一)
- 腾讯视频客户端导出MP4格式
- Android的性能优化
- Wireshark初学