Я вижу некоторые вопросы о проблеме «ListView inside ScrollView».И я знаю, что мы не должны делать такое вложение, просто потому, что оба компонента имеют собственную прокрутку, и Google сказал так (я читал, что это бесполезная вещь).Но в моем текущем проекте мне нужно такое поведение: если просмотр списка может прокручиваться - это прокрутка, если нет (верхняя или нижняя граница списка) - прокрутка прокручивается.Итак, я написал такой код:
public static void smartScroll(final ScrollView scroll, final ListView list){
scroll.requestDisallowInterceptTouchEvent(true);
list.setOnTouchListener(new OnTouchListener() {
private boolean isListTop = false, isListBottom = false;
private float delta = 0, oldY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
oldY = event.getY();
break;
case MotionEvent.ACTION_UP:
delta = 0;
break;
case MotionEvent.ACTION_MOVE:
delta = event.getY() - oldY;
oldY = event.getY();
isListTop = false;
isListBottom = false;
View first = list.getChildAt(0);
View last = list.getChildAt(list.getChildCount()-1);
if(first != null && list.getFirstVisiblePosition() == 0 && first.getTop() == 0 && delta > 0.0f){
isListTop = true;
}
if(last != null && list.getLastVisiblePosition() == list.getCount()-1 && last.getBottom() <= list.getHeight() && delta < 0.0f){
isListBottom = true;
}
if( (isListTop && delta > 0.0f) || (isListBottom && delta < 0.0f) ){
scroll.post(new Runnable() {
public void run() {
scroll.smoothScrollBy(0, -(int)delta);
}
});
}
break;
default: break;
}
scroll.requestDisallowInterceptTouchEvent(true);
return false;
}
});
}
И он работает, по крайней мере, на целевом API 8. Но есть некоторые глюки прокрутки (неестественные переходы).Я думаю, причина в scroll.smoothScrollBy (0, - (int) delta);Есть у кого мысли, как улучшить прокрутку scrollview :)?Он вызывается часто (на ходу) и на почте, может, в этом причина?