「ListView内部のScrollView」に関するいくつかの質問があります。そして私は、両方のコンポーネントが独自のスクロールを持ち、Googleがそう言っているからといって、そのようなネスティングを行うべきではないことを知っている(私はそれが役に立たないことを読んだ)。しかし、私の現在のプロジェクトでは、このような振る舞いが必要です。listviewがスクロールできる場合 - スクロールしていない場合(リストビューの上端または下端) - scrollviewがスクロールしています。 だから、私が書いてきたようなコード:ListView内部のScrollViewスクロールの改善
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)の原因と思います。誰かの考えを持って、スクロールビューのスクロールを改善する方法:)それは頻繁に(動いている時に)呼び出され、ポストでは、それが原因でしょうか?
こんにちは、あなたの現在の考えはどうですか?不自然なジャンプの問題を解決しましたか?ありがとう... – OferR
こんにちは!さて、デザインが変更され、そのような動作はもう必要ありません。私の思考 - 彼らの実装のため、ScrollView内でListViewを使用することはできません。 Googleの人は正しいです:)このような動作を実現するには、ViewGroupに基づいて独自のUIコンポーネントを実装する方がよいでしょう。 – Olsavage
あなたの答えOlsavageありがとう。したがって、私は情報を提示する他の方法を検討しています。 – OferR