在Android开发过程中,Listview在展示某一个指定位置时,列表进行平顺滑动。这时候如果我们使用Listview提供的scrollTo(x,y)或者setSelection(position)进行滑动时,列表的效果就是直接切换,用户很难感受到列表是滑动到列表的某一位置。
如果想要实现有滑动效果的滚动到指定位置怎么办?Listview为我们提供的有实现该效果的方法,smoothScrollBy(x,y)或smoothScrollToPosition(position),但是在用的过程的会发现,smoothScrollToPosition这个方法滚动的位置总是不对,如果用smoothScrollBy又很难计算多种item列表中某一个位置item的位置,所以下面推荐一种实现方式,主要思想是首先采用setSelection方法将列表滚动到目标位置的前一个或后一个,保证目标位置处于列表的可视范围内,然后再采用smoothScrollBy或smoothScrollToPosition方法进行平滑滚动,这样可以在视觉上展示出列表滚动的效果。
如何实现呢,楼主采用了继承Listview,并重写Listview中layoutChildren方法,这样效果比较好一些。重写Listview代码如下,使用时只需要在外面调用smoothPositionTo()方法即可:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
/**
* @author shine on 16-10-27.
*/
public class AutoScrollListView extends ListView {
private int mRequestedScrollPosition = -1;
private int mPreSelectPosition = 0;
private boolean mSmoothScrollRequested;
private boolean mIsScroll = false;
public AutoScrollListView(Context context) {
super(context);
}
public AutoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AutoScrollListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void smoothPositionTo(int position, boolean smoothScroll) {
if(mPreSelectPosition == position){
return;
}
mRequestedScrollPosition = position;
mPreSelectPosition = position;
mSmoothScrollRequested = smoothScroll;
mIsScroll =true;
requestLayout();
}
@Override
protected void layoutChildren() {
super.layoutChildren();
if (mRequestedScrollPosition == -1 || !mIsScroll) {
return;
}
final int position = mRequestedScrollPosition;
mRequestedScrollPosition = -1;
int firstPosition = getFirstVisiblePosition() + 1;
int lastPosition = getLastVisiblePosition();
if (!mSmoothScrollRequested) {
setSelection(position);
super.layoutChildren();
} else {
if(position >= firstPosition && position <= lastPosition){
setSelectionFromTop(position,300);
super.layoutChildren();
smoothScrollBy(300,500);
}else if(position < firstPosition){
setSelection(position + 1);
super.layoutChildren();
smoothScrollToPosition(position);
}else {
setSelectionFromTop(position,500);
super.layoutChildren();
smoothScrollBy(500,500);
}
mIsScroll = false;
}
}
}
网友评论