我有一个带有scrollview的布局,里面是listview。 在触摸时,我希望能够在这两个滚动之间切换,但出于某种原因,当我在ScrollView中时,我无法将其切换到listView的内置滚动。
我尝试过使用这种方法(并且非常喜欢):http://technet.weblineindia.com/mobile/handle-scrollable-views-or-controls-in-another-scrollview-in-android/,但它无法在滚动之间切换。
所以,我尝试了另一种方法 - 我在布局上执行触摸事件,并且我在此布局上使用触摸事件并将触摸事件发送到特定项目(列表视图或滚动),但即使内部if是调用时,listView的ontouch没有被执行。
这是我的布局:
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
<LinearLayout
android:id="@+id/pull_up_main_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/pull_up_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal"
android:visibility="visible" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:gravity="center"
android:text="show layout"
android:textSize="20sp" />
</LinearLayout>
<ListView
android:id="@+id/scroll_list"
android:layout_width="fill_parent"
android:layout_height="match_parent" />
</LinearLayout>
</ScrollView>
<RelativeLayout
android:id="@+id/touch_interceptor"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</RelativeLayout>
和代码:
final ListView listView = (ListView) _view.findViewById(R.id.scroll_list);
final ScrollView mainScroll = (ScrollView) _view.findViewById(R.id.scroll_view);
final RelativeLayout touchInterceptor = (RelativeLayout) _view.findViewById(R.id.touch_interceptor);
touchInterceptor.setOnTouchListener(new OnTouchListener()
{
float lastY = -1;
@Override
public boolean onTouch(View v, MotionEvent event)
{
//change 116 size to not a fixed size.
if (lastY > event.getY() && mainScroll.getScrollY() == 116 && listView.getFirstVisiblePosition() == 0 && listView.getChildAt(0).getTop() <= 0)
{
//even though we arrive here, there's no change in the focus, and still, mainScroll is the chosen scroll.
listView.onTouchEvent(event);
}
else
{
mainScroll.onTouchEvent(event);
}
lastY = event.getY();
return true;
}
});