您的位置:首页 > 其它

关于ListView循环播放的一些事情

2015-09-01 19:10 447 查看
最近有任务,在一个ListView里面有两个item,需要循环播放,还要加一些动画



首先说一下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自动滚动的代码。

有不太稳妥的地方欢迎讨论,要是有更好的解决方法,不吝赐教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: