<< Android-Note

ListViewをScrollView内でスクロールする方法

ScrollView内にListViewを配置してしまうとListViewはスクロールできなくなります。

例えば1つのScrollViewの中にListViewを持つようなレイアウトがあるとします。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
        
	</LinearLayout>

この場合、リストビューよりスクロールビューの方が優先されてしまうのでリストビューをスクロールすることはできません。

そこでコード側で次のような調節をします。

ListView listView = findViewById(R.id.listView);
listView.setOnTouchListener(new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return false;
    }
});

タッチイベントが起こるたびにrequestDisallowInterceptTouchEventメソッドを呼び出しています。

このメソッドは呼び出し元のビューの親またはそれ以上階層が上のビューからタッチイベントが起きた時にそれを遮らせないようにさせることができます。

ScrollViewの中にListViewがあるレイアウト自体が問題あるかもしれませんが、どうしてもというときはこれが一番簡単な解決方法だと思います。

関連項目