Question

J'ai une accumulation View assez complexe, et comme une partie de cela, j'ai un ListView dans un LinearLayout dans un ScrollView (et beaucoup plus de composants, mais ils ne comptent pas dans ce numéro).

Maintenant l'ensemble défile d'activité bien comme il se doit, mais le ListView a une hauteur limitée et lorsque les éléments à l'intérieur de la hauteur, il dépassent, l'écran disparaît de mon. J'ai essayé de placer le ListView à l'intérieur de son propre ScrollView, mais cela ne fonctionne pas. Lorsque je tente de faire défiler sur le ListView, le principal ScrollView est sélectionné et mes écran défile au lieu de ListView.

Ma question peut sembler facile, mais je n'ai pas été en mesure de résoudre ce problème ... Est-il possible de faire ListView scrollable aswell?

Le fichier XML correspondant:

<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>
Était-ce utile?

La solution 2

En fait, la façon dont je l'ai mis en place fonctionne vraiment ... Mise en place d'un ListView dans un LinearLayout dans un ScrollView. Il suffit d'éviter que le ListView est l'enfant direct du ScrollView, et cela fonctionnera très bien ...

Il faut juste savoir que s'il n'y a pas suffisamment d'éléments dans le ListView pour le remplir de sorte qu'il va « hors de l'écran », qu'il ne défile pas (sorte de logique bien). Notez également que lorsque vous avez assez d'articles pour faire défiler, vous devez continuer à appuyer sur un élément dans le ListView pour le faire défiler, et la moitié du temps, l'accent est mis à la scrollview mondiale au lieu de ListView ... Pour éviter ce (la plupart du temps), continuez à appuyer sur le plus haut ou plus bas point, selon la façon dont vous voulez scroll.This permettra d'optimiser vos chances de se concentrer sur votre ListView.

Je l'ai fait une vidéo qu'il est possible, suis le télécharger maintenant sur YouTube ...

http://www.youtube.com/watch?v=c53oIg_3lKY. La qualité est un peu mauvais, mais cela prouve mon point.

Juste pour un aperçu global, je l'utilise ScrollView pour être en mesure de faire défiler mon activité entière, la LinearLayout pour la mise en page de l'activité, et le ListView, eh bien, faire la liste ...

Autres conseils

Au lieu de ListView avec d'autres mises en page à l'intérieur ScrollView créer un ListView avec en-tête et pied de page.

Ajouter des vues qui devraient être au-dessus ListView en-tête:

addHeaderView(View v)

et ci-dessous en bas de page:

addFooterView(View v)

Mettez tout ce qui doit être au-dessus ListView à en-tête de ListView et même avec le pied de page.

    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);

En conséquence, vous aurez une vue scrollable.

Essayez ce code peut vous aider

        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;
            }
        });

Je voudrais simplement noter quelque chose pour la vidéo

Le listview travaille une fois par x touche pas parce que vous l'avez placé dans un LinearLayout mais parce que vous êtes en contact avec le diviseur ...

le scrollview alors considérer que l'endroit que vous avez touché n'a pas d'enfants pour expédier l'MotionEvent à ... il appelle le super.dispatchTouchEvent qui est dans ce cas, le View.dispatchTouchView d'où le listview.onTouchEvent.

Lorsque vous touchez à l'intérieur d'une rangée du scrollview qui est vraiment un viewgroup envoie l'envoi aux enfants dans votre cas, le textview et ne jamais appelle celle de la vue afin que le listview ne défile pas.

Hope mon explication était suffisamment claire pour indiquer pourquoi il ne fonctionne pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top