最近有任务,在一个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自动滚动的代码。
有不太稳妥的地方欢迎讨论,要是有更好的解决方法,不吝赐教