リストビューをスクロールするにはどうすればよいですか?
-
24-10-2019 - |
質問
私は非常に複雑なビューの構築を持っています。その一部として、ScrollView内のLinearLayout内にリストビューがあります(そして、より多くのコンポーネントですが、この問題では問題ではありません)。
現在、アクティビティ全体が必要に応じてきれいにスクロールしますが、ListViewの高さは限られており、その中のアイテムが高さを上回ると、画面が消えます。 ListViewを独自のScrollView内に配置しようとしましたが、これは機能しません。 ListViewでスクロールしようとすると、メインスクロールビューが選択され、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>
解決 2
実際、私がそれをセットアップする方法は本当に機能しています... scrollview内のLinearLayoutにリストビューを配置します。 ListViewがScrollViewの直接の子供であることを避けてください、そしてそれはうまくいくでしょう...
ListViewに「画面外」になるための十分なアイテムがない場合は、スクロールしないことに注意してください(論理的には)。また、スクロールするのに十分なアイテムがある場合は、listViewのアイテムを押し続けてスクロールする必要があることに注意してください。これを避け(ほとんどの場合)、スクロールする方法に応じて、最もトップまたは最もダウンしたアイテムを押し続けてください。これにより、ListViewに集中するチャンスが最適化されます。
私はそれが可能であるというビデオを作りました、今それをYouTubeにアップロードしています...
ビデオはです http://www.youtube.com/watch?v=c53oig_3lky. 。品質はちょっと悪いですが、それは私のポイントを証明しています。
グローバルな概要のために、ScrollViewを使用して、アクティビティ全体、アクティビティのレイアウトのLinearLayout、およびListViewをスクロールすることができます。
他のヒント
scrollview内の他のレイアウトのリストビューの代わりに、ヘッダーとフッターを使用して1つのリストビューを作成します。
ヘッダーとして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;
}
});
ビデオのために何かに注意したい
ListViewは、Xが1回触れています。LinearLayoutの中に配置したからではなく、仕切りに触れているからです...
Scrollviewは、触れた場所にはMotionEventを派遣する子供がいないことを考慮します...したがって、この場合はsuper.dispatchtoucheventを呼び出します。
列の内側に触れると、実際にビューグループであるScrollViewは、テキストビューの場合の子供にディスパッチを送信し、listViewがスクロールしないようにビューの1つを呼び出すことはありません。
私の説明が、なぜ機能していないのかを指摘するのに十分明確であることを願っています。