私は非常に複雑なViewビルドアップを持っており、その一部として、ScrollView内のLinearLayout内にListViewを持っています(そしてかなり多くのコンポーネントがありますが、この問題では重要ではありません)。
これで、アクティビティ全体が適切にスクロールしますが、ListViewの高さには制限があり、その中のアイテムが高さを超えると、画面が消えます。 ListViewを独自のScrollView内に配置しようとしましたが、これは機能しません。 ListViewをスクロールしようとすると、メインのScrollViewが選択され、ListViewの代わりに画面がスクロールします。
私の質問は簡単に聞こえるかもしれませんが、これを修正することができませんでした... ListViewをスクロール可能にすることも可能ですか?
関連するXML:
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout Android:id="@+id/GlobalLayout"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<ListView Android:id="@+id/EndpointList"
Android:choiceMode="multipleChoice"
Android:layout_height="175dip"
Android:layout_width="fill_parent" />
</LinearLayout>
</ScrollView>
実際、私が設定した方法は実際に機能しています... ScrollView内のLinearLayoutにListViewを配置します。 ListViewがScrollViewの直接の子であることを避けてください。そうすれば、問題なく動作します...
ListViewにアイテムを埋めるのに十分なアイテムがないために「画面外」になる場合は、スクロールしないことに注意してください(論理的にはそうですが)。また、スクロールするのに十分なアイテムがある場合は、リストビュー内のアイテムを押し続けてスクロールさせる必要があり、半分の時間、リストビューではなくグローバルスクロールビューにフォーカスが与えられることに注意してください。これを避け(ほとんどの場合)、スクロールする方法に応じて、一番上または一番下のアイテムを押し続けます。これにより、リストビューに集中する機会が最適化されます。
私はそれが可能であるというビデオを作りました、それを今YouTubeにアップロードしています...
ビデオは http://www.youtube.com/watch?v=c53oIg_3lKY です。品質はちょっと悪いですが、それは私の主張を証明しています。
グローバルな概要のために、ScrollViewを使用してアクティビティ全体をスクロールできるようにし、LinearLayoutをアクティビティのレイアウトに使用し、ListViewを使用してリストを作成しました...
ScrollView内の他のレイアウトのListViewの代わりに、ヘッダーとフッターを含む1つのListViewを作成します。
ListViewの上にあるはずのビューをヘッダーとして追加します。
addHeaderView(View v)
以下のフッターとして:
addFooterView(View v)
ListViewの上にあるはずのすべてのものをListViewのヘッダーに配置し、フッターも同じにします。
LayoutInflater inflater = LayoutInflater.from(this);
mTop = inflater.inflate(R.layout.view_top, null);
mBottom = inflater.inflate(R.layout.view_bottom, null);
list.addHeaderView(mTop);
list.addFooterView(mBottom);
// add header and footer before setting adapter
list.setAdapter(mAdapter);
その結果、スクロール可能なビューが1つ表示されます。
このコードを試してみてください
ListView listView = ( ListView ) findViewById(R.id.lsvButton3);
listView.setOnTouchListener(new ListView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle ListView touch events.
v.onTouchEvent(event);
return true;
}
});
ビデオのために何かメモしたいのですが
リストビューは、xが接触するたびに機能します。これは、リストビューを線形レイアウト内に配置したためではなく、仕切りに接触しているためです...
スクロールビューは、タッチした場所にモーションイベントをディスパッチする子がないと見なします...したがって、super.dispatchTouchEventを呼び出します。この場合はView.dispatchTouchViewであるため、listview.onTouchEventを呼び出します。
行の内側をタッチすると、実際にはビューグループであるスクロールビューがディスパッチを子に送信します。この場合はテキストビューであり、ビューの1つを呼び出すことはないため、リストビューはスクロールしません。
私の説明が、なぜそれが機能しないのかを指摘するのに十分明確であったことを願っています。