关于ListView循环播放的一些事情
2015-09-01 19:10
447 查看
最近有任务,在一个ListView里面有两个item,需要循环播放,还要加一些动画
首先说一下ListView的无限循环:
原来使用的是较多个item(在适配器中的getCount中返回较大的数值),有一个弊端就是用户滚动的时候,会发现好多个重复的。之后在美工那里获得点灵感,使用三个循环,第一个和最后一个是相同的,当滚动到第三个的时候,把它换成第一个。
上面是处理滚动的代码,在发送Message的时候,有一个延迟,否则看到item会有闪一下,就不好了
其次是关于缩放的动画效果:
动画效果都好实现,但是在什么时候加载就不好控制了。因为使用了适配器,动画在的加载时间是适配器控制的,注意使用动画的延时就好了。
接着引出了第三个问题,smoothScrollToPositionFromTop 经常会定位不准,这样就会导致即使设置了动画的延时,但是item的初始化时间会有变化,动画还是会经常失效的,产生错误时间的动画,怎么让smoothScrollToPositionFromTop 定位准确一点,不去干扰动画初始化的时间呢?
原理就是当listView不滚动的时候(即smoothScrollToPositionFromTop完成的时候),使用setSelection去定位item,这样的话就不会产生位置错误了。
这里是让listView自动滚动的代码。
有不太稳妥的地方欢迎讨论,要是有更好的解决方法,不吝赐教
首先说一下ListView的无限循环:
原来使用的是较多个item(在适配器中的getCount中返回较大的数值),有一个弊端就是用户滚动的时候,会发现好多个重复的。之后在美工那里获得点灵感,使用三个循环,第一个和最后一个是相同的,当滚动到第三个的时候,把它换成第一个。
Handler handler = new Handler() { @SuppressLint("NewApi") @Override public void handleMessage(Message msg) { super.handleMessage(msg); a = (int) msg.obj; if (msg.what == 1) { listView.smoothScrollToPositionFromTop(a, -2, 1000); } else if (msg.what == 2) { listView.setSelection(0); } } };
上面是处理滚动的代码,在发送Message的时候,有一个延迟,否则看到item会有闪一下,就不好了
其次是关于缩放的动画效果:
动画效果都好实现,但是在什么时候加载就不好控制了。因为使用了适配器,动画在的加载时间是适配器控制的,注意使用动画的延时就好了。
接着引出了第三个问题,smoothScrollToPositionFromTop 经常会定位不准,这样就会导致即使设置了动画的延时,但是item的初始化时间会有变化,动画还是会经常失效的,产生错误时间的动画,怎么让smoothScrollToPositionFromTop 定位准确一点,不去干扰动画初始化的时间呢?
listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(scrollState == SCROLL_STATE_IDLE){ listView.setSelection(a); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
原理就是当listView不滚动的时候(即smoothScrollToPositionFromTop完成的时候),使用setSelection去定位item,这样的话就不会产生位置错误了。
//自动滚动动作 private void autoScroll(){ lv_index = 0; if(null!=autoUpdate){ autoUpdate.cancel(); } autoUpdate = new Timer(); autoUpdate.schedule(new TimerTask() { @Override public void run() { if (lv_index >= listView.getCount()) { lv_index = 0; } if (lv_index >= 0) { Message msg = new Message(); msg.what = 1; msg.obj = lv_index; handler.sendMessage(msg); } if (lv_index == 2) { lv_index = 0; Message msg = new Message(); msg.what = 2; msg.obj = lv_index; handler.sendMessageDelayed(msg, 1000); } lv_index += 1; } }, 0, 3500); }
这里是让listView自动滚动的代码。
有不太稳妥的地方欢迎讨论,要是有更好的解决方法,不吝赐教
相关文章推荐
- IOS科研IOS开发笔记学习基础知识
- 一个关于四位数猜想的验证
- eclipse上安装sonarqube插件
- LeetCode题解——Valid Sudoku
- uva644-字符串
- 获取程序运行时间以判别算法优劣
- Linux mysql 以及sql 语句的使用
- CSDN Markdown 效果
- Objective_C学习笔记
- git环境搭建(四)——git命令
- A*算法 寻路
- python数据结构学习笔记(九)
- uva644-字符串
- 如何监听WebView显示事件
- Web前端研发工程师编程能力飞升之路
- 深入理解计算机操作系统——第11章:CS模型,网络
- 监听session创建和销毁
- leetcode 3: Longest Substring Without Repeating Characters
- SPFA/Dijkstra POJ 3013 Big Christmas Tree
- C# L该系统的应用istView简单的图像浏览器