【一】最近在项目终于到一个这样的问题:listview控件需要监听向上、向下滑动。然后同时产生联动效果,屏幕上方(listview在下方)的一个ScrollView就会执行左、右滑动。
对于我本人的技术来说,确实想想都蛋疼啊。尝试了三种方法,算是找到了一个符合项目的解决办法。下面我说一下我对listvew如何判定向上、向下滑动的个人经验。
【二】很多人会说,监听listview可以不用setOnScrollListener(new OnScrollListener() {}); 确实是这样的,用onTouch那个其实也很快。只不过就是因为项目的需要,我只能寻求使用setOnScrollListener(new OnScrollListener() {});来监听了。以下是主体代码
注意事项:scrollFlag 和 fing 是boolean类型的变量,可以声明为全局变量。自己加上去吧
listview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE://滑动停止
scrollFlag = false;
break;
<span style="white-space:pre"> </span>case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://正在滑动
<span style="white-space:pre"> </span>scrollFlag = true;
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>case OnScrollListener.SCROLL_STATE_FLING://快速触摸后产生的滑动
<span style="white-space:pre"> </span>scrollFlag = true;
<span style="white-space:pre"> </span>fing = true;
<span style="white-space:pre"> </span>break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {//第一个参数是指这个view,第二个参数是当前的listview中能看到的第一个item的position,哪怕是看到一半也算哦。
<span style="white-space:pre"> </span>//第三个参数是当前界面一共可以看见的item个数
<span style="white-space:pre"> </span>//第四个参数是 listview中所有item的个数
<span style="white-space:pre"> </span>}
【三】到这里,这个是listvew.setvOnScrollListener方法中的两个需要重写的方法。第一个方法中的switch语句是用来判断用户的触摸事件。
至于为什么在触摸后滑动中又加了一个boolean变量,这个请看接下来的代码。在第二个重写方法中的内容为
注意事项:lastVisibleItemPosition 是一个Int类型的变量,记得声明一下
<span style="white-space:pre"> </span>int firstVisiblePosition = listview.getFirstVisiblePosition();
if(scrollFlag == true && fing == false){
if(firstVisibleItem > lastVisibleItemPosition || firstVisibleItem-lastVisibleItemPosition == 1){
//Log.i("TAG","向上滑动");
}else if(firstVisibleItem < lastVisibleItemPosition || lastVisibleItemPosition -firstVisibleItem == 1){
//Log.i("TAG","向下滑动");
}else {
return;
}
lastVisibleItemPosition = firstVisibleItem;
}else if(scrollFlag == true && fing == true){
}
【四】至于判断条件中的 firstVisibleItem - lastVisibleItemPosition == 1 (以及下面的也是),这个条件可以要,可以不要。为的是能精确的判断而已;另外fling的代码需要两个boolean 变量都为true的时候执行;最后呢,大家可以参考样式,将自己想要之行的代码或者要做的思路,应用在合适的位置尝试一下吧。谢谢大家,如有不足请指正。