13

私は非常に複雑なビューのビルドアップを行っており、その一環として、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>
4

4 に答える 4

23

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 つ得られます。

于 2011-03-15T13:52:39.597 に答える
4

実際、私がセットアップした方法は実際に機能しています... ListView を ScrollView 内の LinearLayout に配置します。ListView が ScrollView の直接の子であることを避けてください。うまくいくでしょう...

ListView に入力するのに十分な項目がない場合は、「画面外」になり、スクロールしないことに注意してください (論理的にはそうです)。また、スクロールするのに十分な項目がある場合は、ListView 内の項目を押し続けてスクロールさせる必要があり、半分の時間では、ListView ではなくグローバル スクロールビューにフォーカスが与えられることに注意してください。これを (ほとんどの場合) 回避し、スクロールする方法に応じて、一番上または一番下の項目を押し続けます。これにより、ListView にフォーカスする機会が最適化されます。

私はそれが可能であるというビデオを作ったので、今YouTubeにアップロードしています...

ビデオはhttp://www.youtube.com/watch?v=c53oIg_3lKYです。品質はちょっと悪いですが、それは私の主張を証明しています。

全体的な概要を説明するために、ScrollView を使用してアクティビティ全体をスクロールし、LinearLayout をアクティビティのレイアウトに使用し、ListView を使用してリストを作成しました...

于 2011-03-16T09:59:29.453 に答える
3

このコードを試してみてください

        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;
            }
        });
于 2015-05-05T08:09:30.363 に答える
2

動画で注意したいこと

リストビューは、 x が触れるたびに機能しています。それは、線形レイアウト内に配置したためではなく、仕切りに触れているためです...

スクロールビューは、タッチした場所にはモーションイベントをディスパッチする子がないと見なします...したがって、この場合はView.dispatchTouchViewであるsuper.dispatchTouchEventを呼び出し、したがってlistview.onTouchEventを呼び出します。

行の内側に触れると、実際にはビューグループであるスクロールビューが子にディスパッチを送信し、テキストビューの場合、ビューの1つを呼び出すことはないため、リストビューはスクロールしません。

私の説明が、なぜ機能しないのかを指摘するのに十分明確であることを願っています.

于 2012-02-04T22:48:19.937 に答える