ListView in Scroll View my scrollview bewegt sich nach oben auf Listenansicht. Wie kann ich das verhindern?

Ich habe eine Listview in meiner Scroll-Ansicht unter fast einer Seite im Wert von Scroll vor, aber sobald meine Listview bevölkert wird die Scrollview bewegt sich an die Spitze der Listenansicht. Wie kann ich das beheben?

SCROLL VIEW XML:

<ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView> 

Ich habe versucht, sv.fullScroll (ScrollView.FOCUS_UP); Und all das Zeug zu meinem scrollview aber es funktioniert nicht

  • Porting AWT Grafikcode auf Android
  • Android findFragmentByTag gibt null beim Debuggen zurück
  • R.id.container nicht gelöst
  • Die aktuelle Uhrzeit und das Datum auf einer 24-Stunden-Zeitskala
  • Android - CSV-Datei aus Tabellenwerten generieren
  • Wie bekomme ich ein Imageview zu drehen beim Übersetzen in Android?
  • Was ist der Unterschied zwischen commit () und commitAllowingStateLoss () in Fragments
  • Android Studio Vorschau: Diese JVM unterstützt keine Konstante Tag 15
  • 13 Solutions collect form web for “ListView in Scroll View my scrollview bewegt sich nach oben auf Listenansicht. Wie kann ich das verhindern?”

    Zuerst haben Sie wahrscheinlich schon davon gehört, aber nur für den Fall: Sie sollten niemals eine ListView in ein ScrollView , da ListView selbst bereits ein ScrollView und dieser Entwurf gegen die gesamte ListView Idee geht. Wenn du davon überzeugt bist, dass du es benutzen musst, vermutlich gibt es einen besseren Gebrauch zu verwenden und du musst deinen Code irgendwie vereinfachen.

    Nun, auch wenn du noch so etwas gebrauchen willst, kannst du so etwas verwenden:

     package your.package.name; import android.view.View; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.ListView; public class ScrollingListView { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) return; int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } } 

    Sie setzen einfach Ihren Adapter über .setAdapter() und rufen Sie anschließend ScrollingListView.setListViewHeightBasedOnChildren(your_listview) . Dies sollte Ihr Fenster entsprechend Ihrer ListView Höhe ListView .

    —- BEARBEITEN —-

    Das wird wohl der hässlichste Workaround sein, aber versuchen Sie dabei:

     ScrollView sv = (ScrollView) findViewById(R.id.your_scrollview); sv.setEnabled(false); // Populate your ListView sv.setEnabled(true); 

    Wir sollten niemals eine ListView in ein ScrollView .

    Work Around: Wenn ScrollView nach oben / unten verschoben wird, weil listview's notifyDataSetChanged() , dann versuchen,

     scrollview.setEnabled(false); listview.setFocusable(false); adapter.notifyDataSetChanged(); scrollview.setEnabled(true); 

    Gib einfach nur eine Sache vor

     listview.setFocusable(false); 

    Danach kannst du das nochmal machen

     listview.setFocusable(true); 

    Wenn nötig wird es sicher arbeiten

    Fügen Sie alle Sachen oben als Header zur Listenansicht hinzu.

    Nun, da sehe ich den Code .. Du kannst nur eine ViewGroup in einer Scrollview haben. So würden Sie die beiden Layouts in eine andere verziehen, aber ein ListView hat automatisch eine Scroll-Ansicht, damit es nicht wirklich funktioniert.

    Also, was du tun musst, nutzt die addHeader-Ansicht in deiner ListActivity (von Fragment) und lüge LinearLayout1 in der Aktivität aus einer anderen XML-Datei auf.

    hinzufügen:

     android:transcriptMode="disabled" 

    In der Liste willst du nicht blättern

    Von Android Docs

    Es ist nicht möglich, eine scrollbare Ansicht innerhalb einer scrollbaren Ansicht zu machen. Aber als eine Arbeit um diese, und nur für den Fall, dass diese Liste zeigt nicht viel Gedächtnis, wenn alle Ansichten geladen sind. Du kannst das benutzen

     import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; public class NonScrollableListView extends ListView { public NonScrollableListView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Do not use the highest two bits of Integer.MAX_VALUE because they are // reserved for the MeasureSpec mode int heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightSpec); getLayoutParams().height = getMeasuredHeight(); } } 

    Wieder ist es nicht gut, diesen Workaround zu benutzen

    Ich würde die Liste und die anderen Layouts in einem RelativeLayout anstelle eines LinearLayout

     <ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> </LinearLayout> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/container" /> </RelativeLayout> </ScrollView> 

    Auf diese Weise ist die obere Grenze des ListViews auf die untere Grenze des LinearLayout und wird immer unter allem bleiben.

    Du kannst das nicht direkt in die RelativeLayout ! Sehen Sie hier für weitere Details.

    Ich habe 2 oder 3 Änderungen in deiner XML-Datei vorgenommen

     <ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp"> // This will let you see the scroll bar of list view when you scroll your list view. <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="300dp" />// Instead of wraping up your list, if you wish you can give certain height to your list view. </LinearLayout> </ScrollView> 

    Eine andere Sache, die Sie benötigen, ist, den gegebenen Code in Ihrer Java-Datei zu schreiben.

      onCreate() { .... ScrollView sView=(ScrollView)findViewById(R.id.tvscrollview); yourListView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1) { if(arg1.getAction() == MotionEvent.ACTION_DOWN || arg1.getAction() == MotionEvent.ACTION_MOVE) { sView.requestDisallowInterceptTouchEvent(true); } return false; } }); 

    Ich hoffe das hilft dir.

    Vielleicht möchten Sie dies erreichen, indem Sie folgendes verwenden:

      <LinearLayout ......> <ScrollView android:id="@+id/tvscrollview" android:layout_marginTop="8.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include layout="@layout/a" /> <include layout="@layout/b" /> <include layout="@layout/c" /> <include layout="@layout/d" /> </LinearLayout> </ScrollView> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    Wickeln Sie Ihre Listview außerhalb Scrollview und auch in Scrollview, denn Sie sollten niemals ein ScrollView mit einem ListView verwenden, da ListView sich um ein eigenes vertikales Scrollen kümmert. Am wichtigsten ist, dass dies alle wichtigen Optimierungen in ListView für den Umgang mit großen Listen besiegt, da es effektiv zwingt die ListView, um ihre gesamte Liste der Elemente, um den unendlichen Container von ScrollView zu füllen angezeigt.

    Quelle Android Docs

    Die einzige Lösung, die für mich arbeitete, war, ein EditText als das erste Kind des Layouts hinzuzufügen. Hässlich, ich weiß.

     <EditText android:layout_width="0dp" android:layout_height="0dp" /> 

    Ich hatte das gleiche Problem fand ich die Lösung durch Ändern der Sichtbarkeit der Listenansicht in XML nach der Einstellung der Adapter Ich ändere die Sichtbarkeit sichtbar

     listView.setAdapter(adapter); listView.setVisibility(View.VISIBLE); 

    Obwohl es eine sehr späte Antwort auf diese Frage ist und diese Antwort bereits eine akzeptierte Antwort hat, dachte ich, wie ich mein Problem hier gelöst habe, könnte anderen helfen, alles zu finden, was mit diesem Problem in einem einzigen SO-Thread zusammenhängt.

    Also hier ist meine Situation: Ich hatte eine ScrollView mit einem ListView am Ende des Layouts. Ich weiß, es ist eine sehr schlechte Praxis, dies zu tun. Ich könnte das gleiche Verhalten erreichen, das ich wollte, indem ich einen Header an die ListView . Aber trotzdem hat meine ListView den Fokus, wenn sie mit den Daten belegt wurde und die Seite wurde automatisch nach unten ListView wo die ListView gestartet wurde.

    Ich habe mit der akzeptierten Antwort hier versucht, aber es hat nicht für mich gearbeitet. Ich habe versucht, einen Dummy EditText an der Spitze des Layouts zu verwenden, damit es den Fokus automatisch anfordern kann, aber es hat auch nicht funktioniert. Weil die ListView den Fokus bekam, nachdem die Daten von einem REST Api-Aufruf geladen wurden.

    Dann habe ich diese Antwort gefunden und das hat wirklich geholfen Also dachte ich, es hier hineinzulegen, damit andere Hilfe von einem einzigen Thread bekommen könnten, der das gleiche Problem wie mich hat.

    mainScrollView.fullScroll(ScrollView.FOCUS_UP); Hat nicht für mich gearbeitet, entweder als die Liste bevölkert wurde, nachdem die anderen Ansichten besiedelt waren. Also musste ich die ScrollView nach oben ScrollView , nachdem die ListView ist. Also hier ist, wie ich mein Problem gelöst habe.

     mScrollView.setEnabled(false); mIntroducerListView.setFocusable(false); mListAdapter.notifyDataSetChanged(); // Force scroll to the top of the scroll view. // Because, when the list view gets loaded it focuses the list view // automatically at the bottom of this page. mScrollView.smoothScrollTo(0, 0); 

    Ich habe die obigen Antworten ausprobiert, aber keiner von ihnen hat gearbeitet. Unten ist meine endgültige Lösung. Einfach die onFinishInflate- Methode überschreiben, dann einen Beitrag zum scrollenTo (0, 0).

     @Override protected void onFinishInflate() { super.onFinishInflate(); this.post(new Runnable() { @Override public void run() { scrollTo(0, 0); } }); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.