wake-up-neo.com

ListView in ScrollView scrollt auf Android nicht

Ich habe Probleme mit einem Bildlauf ListView in einer ScrollView. Ich habe eine Aktivität, die im oberen Teil einige EditTexts enthält, und dann einen Tab Host mit zwei Tabs, die jeweils eine ListView haben. Wenn die EditText-Ansichten fokussiert sind, wird die Soft-Tastatur angezeigt, und da ich eine ScrollView-Ansicht habe, ist der Inhalt scrollbar. Das Problem tritt jedoch auf, wenn in ListViews mehr Elemente (in Registerkarten) vorhanden sind und ich die ListView nicht scrollen kann, selbst wenn mehr Elemente vorhanden sind.

Folgendes ist das Layout XML:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="?backgroundImage"
    Android:orientation="vertical">

  <LinearLayout
        Android:orientation="horizontal"
        Android:layout_width="fill_parent"
        Android:layout_height="50dip"
        Android:layout_alignParentBottom="true"
        Android:layout_margin="10dip"
        Android:id="@+id/buttons">
    <Button
            Android:text="Save"
            Android:layout_margin="2dip"
            Android:textSize="20dip"
            Android:id="@+id/btnSaveorUpdate"
            Android:layout_height="wrap_content"
            Android:layout_width="145dip"></Button>
    <Button
            Android:text="Cancel"
            Android:layout_margin="2dip"
            Android:textSize="20dip"
            Android:id="@+id/btnCancelorDelete"
            Android:layout_height="wrap_content"
            Android:layout_width="145dip"></Button>
  </LinearLayout>
  <ScrollView
        Android:layout_above="@id/buttons"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:fillViewport="true"
        Android:layout_margin="10dip">
    <LinearLayout
            Android:orientation="vertical"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_margin="10dip">
      <TextView
                Android:text="Bill details"
                Android:textColor="?textColorDark"
                Android:layout_alignParentTop="true"
                Android:id="@+id/txtEnterDetails"
                Android:textSize="25dip"
                Android:textStyle="bold"
                Android:layout_height="wrap_content"
                Android:layout_width="fill_parent"
                Android:layout_marginBottom="2dip"></TextView>
      <LinearLayout
                Android:focusable="true"
                Android:focusableInTouchMode="true"
                Android:layout_width="0dip"
                Android:layout_height="0dip" />
      <EditText
                Android:layout_width="fill_parent"
                Android:hint="Enter data"
                Android:inputType="numberDecimal"
                Android:id="@+id/txtSample"
                Android:textSize="@dimen/editText"
                Android:layout_height="@dimen/editTextHeight"
                Android:text=""></EditText>
      <EditText
                Android:layout_width="fill_parent"
                Android:id="@+id/txtDescription"
                Android:hint="Enter description"
                Android:textSize="@dimen/editText"
                Android:layout_height="@dimen/editTextHeight"
                Android:inputType="text"
                Android:text=""></EditText>
      <EditText
                Android:layout_width="fill_parent"
                Android:id="@+id/txtComment"
                Android:hint="Enter comment (if any)"
                Android:textSize="@dimen/editText"
                Android:layout_height="@dimen/editTextHeight"
                Android:inputType="text"
                Android:text=""></EditText>
      <LinearLayout
                Android:orientation="horizontal"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content">
        <TextView
                    Android:id="@+id/txtDate"
                    Android:layout_width="wrap_content"
                    Android:text=""
                    Android:textSize="20dip"
                    Android:textColor="?textColorDark"
                    Android:layout_marginLeft="10dip"
                    Android:layout_height="@dimen/editTextHeight"
                    Android:layout_gravity="center_vertical" />
        <Button
                    Android:id="@+id/btnPickDate"
                    Android:layout_width="wrap_content"
                    Android:layout_height="@dimen/editTextHeight"
                    Android:text="Select date"
                    Android:layout_margin="2dip"
                    Android:textSize="15dip"
                    Android:layout_gravity="center_vertical" />
      </LinearLayout>
      <TabHost
                Android:id="@+id/tabhost"
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent">
        <LinearLayout
                    Android:id="@+id/linearLayout1"
                    Android:layout_width="fill_parent"
                    Android:layout_height="fill_parent"
                    Android:orientation="vertical">
          <TabWidget
                        Android:layout_width="fill_parent"
                        Android:layout_height="wrap_content"
                        Android:id="@Android:id/tabs"></TabWidget>
          <FrameLayout
                        Android:layout_width="fill_parent"
                        Android:layout_height="fill_parent"
                        Android:id="@Android:id/tabcontent">
            <ScrollView
                            Android:layout_above="@id/buttons"
                            Android:layout_width="fill_parent"
                            Android:layout_height="fill_parent"
                            Android:fillViewport="true"
                            Android:id="@+id/tab1">
              <LinearLayout
                                Android:layout_width="fill_parent"
                                Android:layout_height="wrap_content"
                                Android:orientation="vertical">
                <TableLayout
                                    Android:layout_height="wrap_content"
                                    Android:layout_width="fill_parent">
                  <TableRow
                                        Android:id="@+id/tableRow1"
                                        Android:layout_marginLeft="2dip"
                                        Android:layout_marginRight="5dip"
                                        Android:layout_width="fill_parent"
                                        Android:layout_height="wrap_content">
                    <LinearLayout
                                            Android:layout_width="fill_parent"
                                            Android:layout_height="wrap_content"
                                            Android:orientation="horizontal">
                      <ImageView
                                                Android:src="@drawable/ic_menu_invite"
                                                Android:layout_width="40dip"
                                                Android:layout_height="40dip"
                                                Android:layout_gravity="center_vertical"></ImageView>
                      <TextView
                                                Android:text="Add friend"
                                                Android:layout_height="wrap_content"
                                                Android:layout_width="fill_parent"
                                                Android:layout_centerVertical="true"
                                                Android:textColor="?textColorDark"
                                                Android:textSize="@dimen/editText"
                                                Android:layout_gravity="center_vertical" />
                    </LinearLayout>
                  </TableRow>
                  <TableRow
                                        Android:layout_width="fill_parent"
                                        Android:layout_height="wrap_content"
                                        Android:layout_marginLeft="5dip"
                                        Android:layout_marginRight="5dip">
                    <TextView
                                            Android:id="@+id/txtData1"
                                            Android:layout_width="170dip"
                                            Android:layout_height="wrap_content"
                                            Android:text="Data"
                                            Android:textSize="14dip"
                                            Android:textStyle="bold"
                                            Android:textColor="#000000">
                    </TextView>
                    <TextView
                                            Android:id="@+id/txtData2"
                                            Android:layout_width="wrap_content"
                                            Android:layout_height="wrap_content"
                                            Android:text="Sample"
                                            Android:textSize="13dip"
                                            Android:textColor="#000000"></TextView>

                  </TableRow>
                </TableLayout>
                <ListView
                                    Android:cacheColorHint="#00000000"
                                    Android:id="@+id/ListView01"
                                    Android:layout_height="wrap_content"
                                    Android:layout_width="fill_parent" />
              </LinearLayout>
            </ScrollView>
            <LinearLayout
                            Android:layout_width="wrap_content"
                            Android:layout_height="wrap_content"
                            Android:gravity="center_horizontal"
                            Android:id="@+id/tab2"
                            Android:orientation="vertical">
              <TableLayout
                                Android:layout_height="wrap_content"
                                Android:layout_width="fill_parent">
                <TableRow
                                    Android:id="@+id/tableRow2"
                                    Android:layout_marginLeft="2dip"
                                    Android:layout_marginRight="5dip"
                                    Android:layout_width="fill_parent"
                                    Android:layout_height="wrap_content">
                  <LinearLayout
                                        Android:layout_width="fill_parent"
                                        Android:layout_height="wrap_content"
                                        Android:orientation="horizontal">
                    <ImageView
                                            Android:src="@drawable/ic_menu_invite"
                                            Android:layout_width="40dip"
                                            Android:layout_height="40dip"
                                            Android:layout_gravity="center_vertical"></ImageView>
                    <TextView
                                            Android:text="Sample"
                                            Android:layout_height="wrap_content"
                                            Android:layout_width="fill_parent"
                                            Android:layout_centerVertical="true"
                                            Android:textColor="?textColorDark"
                                            Android:textSize="@dimen/editText"
                                            Android:layout_gravity="center_vertical" />
                  </LinearLayout>
                </TableRow>
                <TableRow
                                    Android:layout_width="fill_parent"
                                    Android:layout_height="wrap_content"
                                    Android:layout_marginLeft="5dip"
                                    Android:layout_marginRight="5dip">
                  <TextView
                                        Android:id="@+id/txtUser1"
                                        Android:layout_width="170dip"
                                        Android:layout_height="wrap_content"
                                        Android:text="User"
                                        Android:textSize="14dip"
                                        Android:textStyle="bold"
                                        Android:textColor="#000000">
                  </TextView>
                  <TextView
                                        Android:id="@+id/txtUserData"
                                        Android:layout_width="wrap_content"
                                        Android:layout_height="wrap_content"
                                        Android:text="UserData"
                                        Android:textSize="13dip"
                                        Android:textColor="#000000"></TextView>
                </TableRow>
              </TableLayout>

              <ListView
                                Android:cacheColorHint="#00000000"
                                Android:id="@+id/ListView02"
                                Android:layout_height="wrap_content"
                                Android:layout_width="fill_parent" />

            </LinearLayout>


          </FrameLayout>
        </LinearLayout>
      </TabHost>
    </LinearLayout>
  </ScrollView>
</RelativeLayout>

Kann mir bitte jemand sagen, wo das Problem liegt? Ich habe einen weiteren Beitrag über das ListView-Problem in ScrollView, aber in meinem Fall nützen sie nichts.

144
Ashwani K

Sie sollten keine ListView in eine ScrollView einfügen, da die ListView-Klasse ihren eigenen Bildlauf durchführt und keine Gesten erhält, da sie alle von der übergeordneten ScrollView-Klasse verarbeitet werden. Ich empfehle Ihnen dringend, Ihr Layout irgendwie zu vereinfachen. Sie können z. B. Ansichten hinzufügen, die als Kopf- oder Fußzeile zur ListView gescrollt werden sollen.

UPDATE:

Ab API Level 21 (Lollipop) werden verschachtelte Scroll-Container offiziell vom Android SDK unterstützt. Es gibt eine Reihe von Methoden in View- und ViewGroup-Klassen, die diese Funktionalität bereitstellen. Damit der verschachtelte Bildlauf auf dem Lollipop funktioniert, müssen Sie ihn für eine untergeordnete Bildlaufansicht aktivieren, indem Sie der XML-Deklaration Android:nestedScrollingEnabled="true" hinzufügen oder setNestedScrollingEnabled(true) explizit aufrufen.

Wenn Sie verschachtelten Bildlauf auf Pre-Lollipop-Geräten durchführen möchten, was Sie wahrscheinlich tun, müssen Sie entsprechende Dienstprogrammklassen aus der Support-Bibliothek verwenden. Zunächst müssen Sie Ihre ScrollView durch NestedScrollView ersetzen. Letzteres implementiert sowohl NestedScrollingParent als auch NestedScrollingChild , so dass es als übergeordneter oder untergeordneter Bildlaufcontainer verwendet werden kann.

ListView unterstützt jedoch kein verschachteltes Scrollen. Daher müssen Sie es subclassieren und NestedScrollingChild implementieren. Glücklicherweise enthält die Support-Bibliothek die Klasse NestedScrollingChildHelper , sodass Sie nur eine Instanz dieser Klasse erstellen und ihre Methoden aus den entsprechenden Methoden Ihrer View-Klasse aufrufen müssen.

155
Michael

Ich habe eine Lösung gefunden, die hervorragend funktioniert und die ListView ohne Probleme scrollen kann:

ListView lv = (ListView)findViewById(R.id.myListView);  // your listview inside scrollview
lv.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;
        }
    });

Dies macht die TouchEvents auf der ScrollView deaktivieren und die ListView dazu bringen, sie abzufangen. Es ist einfach und funktioniert immer.

295
Moisés Olmedo

Ich habe auch eine Lösung. Ich verwende immer diese Methode. Versuche dies

<ScrollView
    Android:id="@+id/createdrill_scrollView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >


        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginLeft="20dp"
            Android:layout_marginRight="20dp"
            Android:layout_marginTop="15dp" >

            <net.thepaksoft.fdtrainer.NestedListView
                Android:id="@+id/crewList"
                Android:layout_width="0dip"
                Android:layout_height="wrap_content"
                Android:layout_marginBottom="2dp"
                Android:layout_weight="1"
                Android:background="@drawable/round_shape"
                Android:cacheColorHint="#00000000" >
            </net.thepaksoft.fdtrainer.NestedListView>
        </LinearLayout>

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginLeft="20dp"
            Android:layout_marginRight="20dp"
            Android:layout_marginTop="15dp" >

            <net.thepaksoft.fdtrainer.NestedListView
                Android:id="@+id/benchmarksList"
                Android:layout_width="0dip"
                Android:layout_height="wrap_content"
                Android:layout_marginBottom="2dp"
                Android:layout_weight="1"
                Android:background="@drawable/round_shape"
                Android:cacheColorHint="#00000000" >
            </net.thepaksoft.fdtrainer.NestedListView>
        </LinearLayout>

</ScrollView>

NestedListView.Java-Klasse:

public class NestedListView extends ListView implements OnTouchListener, OnScrollListener {

    private int listViewTouchAction;
    private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;

    public NestedListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        listViewTouchAction = -1;
        setOnScrollListener(this);
        setOnTouchListener(this);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                scrollBy(0, -1);
            }
        }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int newHeight = 0;
        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (heightMode != MeasureSpec.EXACTLY) {
            ListAdapter listAdapter = getAdapter();
            if (listAdapter != null && !listAdapter.isEmpty()) {
                int listPosition = 0;
                for (listPosition = 0; listPosition < listAdapter.getCount()
                        && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) {
                    View listItem = listAdapter.getView(listPosition, null, this);
                    //now it will not throw a NPE if listItem is a ViewGroup instance
                    if (listItem instanceof ViewGroup) {
                        listItem.setLayoutParams(new LayoutParams(
                                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                    }
                    listItem.measure(widthMeasureSpec, heightMeasureSpec);
                    newHeight += listItem.getMeasuredHeight();
                }
                newHeight += getDividerHeight() * listPosition;
            }
            if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) {
                if (newHeight > heightSize) {
                    newHeight = heightSize;
                }
            }
        } else {
            newHeight = getMeasuredHeight();
        }
        setMeasuredDimension(getMeasuredWidth(), newHeight);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                scrollBy(0, 1);
            }
        }
        return false;
    }
}
138

Sie müssen nur Ihren <ScrollView ></ScrollView> durch diesen Custom ScrollView wie <com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview > ersetzen. 

package com.tmd.utils;

import Android.content.Context;
import Android.util.AttributeSet;
import Android.util.Log;
import Android.view.MotionEvent;
import Android.widget.ScrollView;

public class VerticalScrollview extends ScrollView{

    public VerticalScrollview(Context context) {
        super(context);
    }

     public VerticalScrollview(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:
                    Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" );
                    super.onTouchEvent(ev);
                    break;

            case MotionEvent.ACTION_MOVE:
                    return false; // redirect MotionEvents to ourself

            case MotionEvent.ACTION_CANCEL:
                    Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" );
                    super.onTouchEvent(ev);
                    break;

            case MotionEvent.ACTION_UP:
                    Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" );
                    return false;

            default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break;
        }

        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
        Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() );
         return true;
    }
}
46
Atul Bhardwaj

Ich hatte ein ähnliches Problem und beim Googeln fand ich Ihre Frage. Ja markierte Antwort hat auch für mich funktioniert, aber es gab ein Problem.
Jedenfalls habe ich eine andere Lösung gefunden . , das perfekt funktioniert, ohne irgendwelche Jonglierarbeiten zu machen.

11
Priyank
list.setOnTouchListener(new OnTouchListener() {
    // Setting on Touch Listener for handling the touch inside ScrollView
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Disallow the touch request for parent scroll on touch of child view
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return false;
    }
});
10
Salman Ashraf

Hier ist die genaue Methode für die Verwendung von Listview in der Bildlaufansicht. Alles, was wir mit Touch-Events zu tun haben. 

      lstvNextTracks.setOnTouchListener(new OnTouchListener()
      {
          @Override
          public boolean onTouch(View v, MotionEvent event)
          {
         Log.e("Lisview *************", "focused");
         SCView.requestDisallowInterceptTouchEvent(true);
         return false;
          }
      });




    SCView.setOnTouchListener(new OnTouchListener()
    {

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            int arr[] = new int[] { 1, 2 };
            lstvNextTracks.getLocationOnScreen(arr);

            /* Get bounds of child Listview*/
            int lstvTop = arr[0];
            int lstvBottom = arr[1] + lstvNextTracks.getHeight();
            int lstvLeft = arr[1];
            int lstvRight = arr[0] + lstvNextTracks.getWidth();

            float x = event.getRawX();
            float y = event.getRawY();

            if (event.getAction() == MotionEvent.ACTION_DOWN)
            {
                /*check if child ListView bounds are touched*/
                if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight)
                {
                    SCView.clearFocus();
                    /*This statement tells the ScrollView to do not handle this touch event, so the child Listview will handle this touch event and will scroll */
                    SCView.requestDisallowInterceptTouchEvent(true);
                    /*The child Listview isFocusable attribute must be set to true otherwise it will not work*/
                    lstvNextTracks.requestFocus();
                    return true;
                } else
                    return false;
            } else if (event.getAction() == MotionEvent.ACTION_MOVE)
            {

                if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight)
                {
                    SCView.clearFocus();
                    SCView.requestDisallowInterceptTouchEvent(true);
                    lstvNextTracks.requestFocus();
                    return true;
                } else
                    return false;
            } else if (event.getAction() == MotionEvent.ACTION_UP)
            {
                SCView.clearFocus();
                SCView.requestDisallowInterceptTouchEvent(true);
                lstvNextTracks.requestFocus();
                return false;
            } else
            {
                return false;
            }
        }
    });
6
Muhammad Bilal

Verwenden Sie die folgende Methode und genießen Sie es!

private void setListViewScrollable(final ListView list) {
    list.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            listViewTouchAction = event.getAction();
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                list.scrollBy(0, 1);
            }
            return false;
        }
    });

    list.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                list.scrollBy(0, -1);
            }
        }
    });
}

listViewTouchAction ist ein globaler Integerwert. Wenn Sie die Zeile ersetzen können 

list.scrollBy(0, 1);

mit etwas anderem teilen Sie es uns bitte mit.

Genießen!

6
Bobs

Es ist eine schlechte Praxis, zwei verschiedene Bildlaufansichten zusammen zu haben. ListView selbst verfügt über eine eigene Bildlauffunktion, und die Höhe wird automatisch entsprechend den Adaptereinstellungen für Ihre Zeilenelemente angepasst. (Bei Keelping-Einstellungen setzen wir in unserer Layout-XML keine spezifische Höhe für ListView.) In Ihrem Fall können Sie jedoch ListView durch eine Klasse ersetzen. Dadurch wird die Höhe für Ihre ListView angepasst, wobei zu berücksichtigen ist, dass sich Ihre ListView in ScrollView befindet.

Das wird dir helfen:

public class ExpandableHeightListview extends ListView
{

    boolean expanded = false;

    public ExpandableHeightListview(Context context)
    {
        super(context);
    }

    public ExpandableHeightListview(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ExpandableHeightListview(Context context, AttributeSet attrs,int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded()
    {
        return expanded;
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        // HACK! TAKE THAT Android!
        if (isExpanded())
        {
            // Calculate entire height by providing a very large height hint.
            // But do not use the highest 2 bits of this integer; those are
            // reserved for the MeasureSpec mode.
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);

            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        }
        else
        {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded)
    {
        this.expanded = expanded;
    }
}

Erweitern Sie jetzt Ihre ListView mit dieser Klasse. Ändern Sie einfach Ihr ListView-Tag aus Ihrer Ressourcen-XML in Smothing, 

<yourpackagename.ExpandableHeightListview
            Android:id="@+id/listView"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:background="@color/White"
            Android:scrollbars="none"
            Android:orientation="vertical"
            Android:fadingEdge="none">
            </cyourpackagename.ExpandableHeightListview>

Dies löst Ihr Scrollproblem von ListView, da der übergeordnete Scroll jetzt von ScrollView statt von ListView verwaltet wird.

4
Ravi Kabra

Ich habe ein ähnliches Problem und wurde durch Erstellen einer benutzerdefinierten Klasse durch Erweitern mit ListView behoben.

ScrollableListView.Java

import Android.content.Context;
import Android.util.AttributeSet;
import Android.widget.ListView;

public class ScrollableListView extends ListView {

    public ScrollableListView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollableListView (Context context) {
        super(context);
    }

    public ScrollableListView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

Verwendungszweck:

<com.my.package.ScrollableListView
    Android:id="@+id/listview"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"/>
3
Waqar UlHaq

Ich habe fast alle der oben genannten Methoden getestet und ausprobiert. Vertrauen Sie mir, nachdem ich RecyclerView vollständig verlassen habe, habe ich mein ListView durch RecyclerView ersetzt und es hat perfekt funktioniert. Ich brauchte keine 3rd Party-Bibliothek für ExtendedHeightListView und alles, einfach nur RecyclerView.

Also hier meine Layoutdatei vor dem RecyclerView:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/scrollView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:elevation="5dp">

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/relativeLayoutre"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_margin="2dp"
    tools:context="com.example.Android.udamovappv3.activities.DetailedActivity">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/my_toolbar_detail"
        Android:layout_width="match_parent"
        Android:layout_height="56dp"
        Android:layout_gravity="top"
        Android:background="?attr/colorPrimary"
        Android:elevation="4dp"
        Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <TextView
        Android:id="@+id/title_name"
        Android:layout_width="fill_parent"
        Android:layout_height="128dp"
        Android:layout_alignParentStart="true"
        Android:layout_marginTop="59dp"
        Android:background="#079ED9"
        Android:gravity="left|center"
        Android:padding="25dp"
        Android:text="Name"
        Android:textColor="#ffffff"
        Android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@+id/my_toolbar_detail"
        app:layout_constraintVertical_bias="0.0"
        tools:layout_editor_absoluteX="0dp" />


    <ImageView
        Android:id="@+id/iv_poster"
        Android:layout_width="131dp"
        Android:layout_height="163dp"
        Android:layout_alignStart="@+id/my_toolbar_detail"
        Android:layout_below="@+id/title_name"
        Android:layout_marginBottom="15dp"
        Android:layout_marginRight="8dp"
        Android:layout_marginTop="15dp"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:srcCompat="@mipmap/ic_launcher" />

    <Button
        Android:id="@+id/bt_mark_as_fav"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignBottom="@+id/iv_poster"
        Android:layout_alignParentEnd="true"
        Android:layout_marginBottom="11dp"
        Android:layout_marginEnd="50dp"
        Android:background="#079ED9"
        Android:text="Mark As \n Favorite"
        Android:textSize="10dp" />

    <TextView
        Android:id="@+id/tv_runTime"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignStart="@+id/tv_rating"
        Android:layout_below="@+id/tv_releaseDate"
        Android:layout_marginTop="11dp"
        Android:text="TextView"
        Android:textSize="20sp" />

    <TextView
        Android:id="@+id/tv_releaseDate"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignStart="@+id/tv_runTime"
        Android:layout_alignTop="@+id/iv_poster"
        Android:text="TextView"
        Android:textSize="25dp" />

    <TextView
        Android:id="@+id/tv_rating"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignStart="@+id/bt_mark_as_fav"
        Android:layout_below="@+id/tv_runTime"
        Android:layout_marginTop="11dp"
        Android:text="TextView" />

    <TextView
        Android:id="@+id/tv_overview"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_below="@+id/iv_poster"
        Android:layout_centerHorizontal="true"
        Android:layout_marginBottom="5dp"
        Android:foregroundGravity="center"
        Android:text="adasdasdfadfsasdfasdfasdfasdfnb agfjuanfalsbdfjbdfklbdnfkjasbnf;kasbdnf;kbdfas;kdjabnf;lbdnfo;aidsnfl';asdfj'plasdfj'pdaskjf'asfj'p[asdfk"
        Android:textColor="#000000"
         />


    <RelativeLayout
        Android:id="@+id/foodItemActvity_linearLayout_fragments"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:layout_below="@+id/tv_overview">
        <TextView
            Android:id="@+id/fragment_dds_review_textView_label"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Reviews:"

            Android:textAppearance="?android:attr/textAppearanceMedium" />
        <com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView
            Android:id="@+id/expandable_listview"
            Android:layout_width="fill_parent"
            Android:layout_height="match_parent"
            Android:layout_alignParentBottom="true"
            Android:layout_alignParentStart="true"
            Android:layout_below="@+id/fragment_dds_review_textView_label"
            Android:padding="8dp">

        </com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView>
    </RelativeLayout>
</RelativeLayout>
</ScrollView>

DIESES IS NACH DEM ERSETZEN MEINER LISTVIEW MIT EINER DER VORSTEHENDEN LÖSUNGEN. Das Problem war also, dass sich die Listenansicht aufgrund von 2 Scrollview-Fehlern (möglicherweise nicht eines Fehlers) in Android nicht richtig verhalten hat. 

Ich ersetzte die .__ durch die Recycler-Ansicht, um mein endgültiges Layout zu bilden. 

Dies ist mein Recycler View Adapter:

public class TrailerAdapter extends RecyclerView.Adapter<TrailerAdapter.TrailerAdapterViewHolder> {

private ArrayList<String> Youtube_URLS;

private Context Context;

public TrailerAdapter(Context context, ArrayList<String> Youtube_URLS){
    this.Context = context;
    this.Youtube_URLS = Youtube_URLS;
}
@Override
public TrailerAdapter.TrailerAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.trailer_layout, parent, false);
    return new TrailerAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(TrailerAdapter.TrailerAdapterViewHolder holder, int position) {
    Picasso.with(Context).load(R.drawable.ic_play_arrow_black_24dp).into(holder.iv_playbutton);
    holder.item_id.setText(Youtube_URLS.get(position));
}

@Override
public int getItemCount() {
    if(Youtube_URLS.size()==0){
        return 0;
    }else{
        return Youtube_URLS.size();
    }
}

public class TrailerAdapterViewHolder extends RecyclerView.ViewHolder {
    ImageView iv_playbutton;
    TextView item_id;

    public TrailerAdapterViewHolder(View itemView) {
        super(itemView);
        iv_playbutton = (ImageView)itemView.findViewById(R.id.play_button);
        item_id = (TextView)itemView.findViewById(R.id.tv_trailer_sequence);
    }
}
}

Und das ist mein RecyclerView-Layout:

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="56dp"
    Android:padding="6dip" >

    <ImageView
        Android:id="@+id/play_button"
        Android:layout_width="70dp"
        Android:layout_height="wrap_content"
        Android:layout_marginRight="6dip"
        Android:layout_marginStart="12dp"
        Android:src="@drawable/ic_play_arrow_black_24dp"
        Android:layout_centerVertical="true"
        Android:layout_alignParentStart="true" />

    <TextView
        Android:id="@+id/tv_trailer_sequence"
        Android:layout_width="wrap_content"
        Android:layout_height="26dip"
        Android:layout_centerVertical="true"
        Android:layout_toEndOf="@+id/play_button"
        Android:ellipsize="Marquee"
        Android:gravity="center"
        Android:maxLines="1"
        Android:text="Description"
        Android:textSize="12sp" />

</RelativeLayout>

Und VOILA, ich habe den gewünschten Effekt von ListView (Now RecyclerView) in einem Scollview erhalten. Hier ist das letzte Bild der Benutzeroberfläche

Abschließend glaube ich, dass der Austausch des RecyclerView eine bessere Wahl für mich war, da er die Stabilität der App insgesamt verbesserte und mir auch dabei half, RecyclerView besser zu verstehen. Wenn ich eine Lösung vorschlagen würde, ersetze ich Ihre ListView durch eine RecyclerView.

1
Pushkaraj Joshi

Ich weiß, dass diese Frage längst gestellt wurde, aber wer jetzt feststeckt, kann dies lösen, indem er diese Zeile in Ihre ListView hinzufügt

Android:nestedScrollingEnabled="true"

Zum Beispiel - 

                    <ListView
                    Android:id="@+id/listView"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:nestedScrollingEnabled="true" />
1
Karan

Die oben genannte Lösung von @Shailesh Rohit funktioniert einwandfrei. Einige Tricks müssen gemacht werden.

  1. Wenn Sie die Helper-Klasse in dieselbe Klasse (Hauptklasse) einfügen, machen Sie die Helper-Klasse als statisch und getListViewSize () nicht statisch.

  2. Am wichtigsten schreiben Sie "Helper.getListViewSize (listView);" Anweisung nach dem erstmaligen Setzen des Adapters wie "listView.setAdapter (myAdapter);" sowie wann immer Sie "myAdapter.notifyDataSetChanged ();"

  3. Die Verwendung wird unten gezeigt.

    listView = (ListView) findViewById (R.id.listView); myAdapter = neuer ArrayAdapter (dieser Android.R.layout.simple_list_item_1, listValues); getListViewSizelistView (listView);

    myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);

1
Tara

Die beste Lösung ist die Verwendung von NestedScrollVew mit RecyclerView. Wenn Sie mit Listview fortfahren möchten, können Sie der folgenden Header- und Fußzeilenansicht hinzufügen.

View footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.outofoffice_footer_view, null, false);
infoListView.addFooterView(footerView);
1
Srishti Roy

Demo_ListView_In_ScrollView

=============================== 

            package com.app.custom_seekbar;

            import Java.util.ArrayList;

            import Android.app.Activity;
            import Android.os.Bundle;
            import Android.widget.ListView;

            public class Demo_ListView_In_ScrollView  extends Activity
            {
                ListView listview;
                ArrayList<String> data=null;
                listview_adapter adapter=null;

                @Override
                protected void onCreate(Bundle savedInstanceState) 
                {
                    // TODO Auto-generated method stub
                    super.onCreate(savedInstanceState);
                    super.setContentView(R.layout.demo_listview_in_scrollview_activity);
                    init();
                    set_data();
                    set_adapter();


                }
                public void init()
                {
                    listview=(ListView)findViewById(R.id.listView1);
                    data=new ArrayList<String>();

                }
                public void set_data()
                {
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");
                    data.add("Meet");
                    data.add("prachi");
                    data.add("shailesh");
                    data.add("manoj");
                    data.add("sandip");
                    data.add("zala");
                    data.add("tushar");



                }

                public void set_adapter()
                {
                    adapter=new listview_adapter(Demo_ListView_In_ScrollView.this,data);
                    listview.setAdapter(adapter);
                    Helper.getListViewSize(listview); // set height of listview according to Arraylist item  
                }

            }

==========================

listview_adapter 

============================

        package com.app.custom_seekbar;

        import Java.util.ArrayList;

        import Android.app.Activity;
        import Android.view.LayoutInflater;
        import Android.view.MotionEvent;
        import Android.view.View;
        import Android.view.ViewGroup;
        import Android.widget.ArrayAdapter;
        import Android.widget.LinearLayout;
        import Android.widget.ScrollView;
        import Android.widget.TextView;

        public class listview_adapter  extends ArrayAdapter<String>  
        {
            private final Activity context;
            ArrayList<String>data;
            class ViewHolder 
            {
                public TextView tv_name;
                public ScrollView scroll;
                public LinearLayout l1;
            }


            public listview_adapter(Activity context, ArrayList<String> all_data) {
                super(context, R.layout.item_list_xml, all_data);
                this.context = context;
                data=all_data;
            }
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                View rowView = convertView;
                ViewHolder viewHolder;
                if (rowView == null)
                {
                    LayoutInflater inflater = context.getLayoutInflater();
                    rowView = inflater.inflate(R.layout.item_list_xml, null);

                    viewHolder = new ViewHolder();

                    viewHolder.tv_name=(TextView)rowView.findViewById(R.id.textView1);

                    rowView.setTag(viewHolder);
                }
                else
                viewHolder = (ViewHolder) rowView.getTag();

                viewHolder.tv_name.setText(data.get(position).toString());
                return rowView;

            }


        }

====================================

Helferklasse 

=====================================

    import Android.util.Log;
    import Android.view.View;
    import Android.view.ViewGroup;
    import Android.widget.ListAdapter;
    import Android.widget.ListView;

    public class Helper {
        public static void getListViewSize(ListView myListView) {
            ListAdapter myListAdapter = myListView.getAdapter();
            if (myListAdapter == null) {
                //do nothing return null
                return;
            }
            //set listAdapter in loop for getting final size
            int totalHeight = 0;
            for (int size = 0; size < myListAdapter.getCount(); size++) {
                View listItem = myListAdapter.getView(size, null, myListView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }
          //setting listview item in adapter
            ViewGroup.LayoutParams params = myListView.getLayoutParams();
            params.height = totalHeight + (myListView.getDividerHeight() *                   (myListAdapter.getCount() - 1));
            myListView.setLayoutParams(params);
            // print height of adapter on log
            Log.i("height of listItem:", String.valueOf(totalHeight));
        }
    }

==========================

demo_listview_in_scrollview_activity.xml

==========================

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:orientation="vertical" >

            <ScrollView
                Android:id="@+id/scrollView1"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content" >

                <LinearLayout
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:orientation="vertical" >

                    <ListView
                        Android:id="@+id/listView1"
                        Android:layout_width="match_parent"
                        Android:layout_height="wrap_content" >
                    </ListView>
                </LinearLayout>
            </ScrollView>

        </LinearLayout>

==================

item_list_xml.xml

====================

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:orientation="vertical" >

            <TextView
                Android:id="@+id/textView1"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="center_horizontal"
                Android:gravity="center"
                Android:text="TextView"
                Android:textSize="14sp" />

        </LinearLayout>
1
shailesh Rohit

Hinzufügen: Android:nestedScrollingEnabled="true"

0
DENIS VICTOR

Versuchen Sie dies mit ScrollView, nicht mit ListView.

public class xScrollView extends ScrollView
{
    ;
    ;
    @Override
    public boolean onInterceptTouchEvent (MotionEvent ev)
    {
        return false;
    }
}
0
Kim Sangdeuk

requestDisallowInterceptTouchEvent (boolean disallowIntercept)

Wird aufgerufen, wenn ein Kind nicht wünscht, dass dieses übergeordnete Element und seine Vorfahren Berührungsereignisse mit onInterceptTouchEvent (MotionEvent) ..__ abfangen. Dieser Elternteil sollte diesen Anruf an seine Eltern weiterleiten. Dieser übergeordnete Benutzer muss dieser Anforderung für die Dauer der Berührung folgen (dh, das Kennzeichen muss erst gelöscht werden, nachdem dieser übergeordnet oder storniert wurde).

Versuchen Sie diese Antwort,

    listview.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

// Disallow the touch request for parent scroll on touch of child view
            scrollView.requestDisallowInterceptTouchEvent(true);

            int action = event.getActionMasked();
            switch (action) {
                case MotionEvent.ACTION_UP:
                    scrollView.requestDisallowInterceptTouchEvent(false);
                    break;
            }
            return false;
        }
    });
0
Ranjith Kumar

Laut meiner Angabe während Sie setOnTouchListener von parent oder child verwenden, stoppen Sie den Bildlauf des übergeordneten Elements, wenn Sie auf untergeordnetes Element tippen

0
sharma_kunal

Ersetzen Sie ScrollView durch Android.support.v4.widget.NestedScrollView innerhalb von XML. es läuft 

1) Verwendung in XML :::: Android.support.v4.widget.NestedScrollView

anstelle von :::: ScrollView

2) Und für die Listendarstellung auf diese Weise mit NonScrollListView in der cs-Datei verwenden:

public class NonScrollListView extends ListView {    

    public NonScrollListView(Context context) {    
        super(context);
    }    
    public NonScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }    
}    

3) Verwenden Sie schließlich diesen Code, um die Scrollansicht in der cs-Datei zu identifizieren: 

NonScrollListView listView = (NonScrollListView) view.findViewById(R.id.listview);
0
Amit yadav

Verwenden Sie diese Methode und Ihre Listenansicht wird innerhalb der Bildlaufleiste scrollbar: -

   ListView lstNewsOffer.setAdapter(new ViewOfferAdapter(
                            ViewNewsDetail.this, viewOfferList));
                    getListViewSize(lstNewsOffer);

void getListViewSize(ListView myListView) {
    ListAdapter myListAdapter = myListView.getAdapter();
    if (myListAdapter == null) {
        // do nothing return null
        return;
    }
    // set listAdapter in loop for getting final size
    int totalHeight = 0;
    for (int size = 0; size < myListAdapter.getCount(); size++) {
        View listItem = myListAdapter.getView(size, null, myListView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }
    // setting listview item in adapter
    ViewGroup.LayoutParams params = myListView.getLayoutParams();
    params.height = totalHeight
            + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1));
    myListView.setLayoutParams(params);
    // print height of adapter on log
    Log.i("height of listItem:", String.valueOf(totalHeight));
}

ersetzen Sie ListView durch RecycleView in ScrollView. es läuft reibungslos ohne zusätzlichen Quellcode:

 <ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.hung.recycleviewtest.MainActivityFragment"
    >
    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">
        <Android.support.v7.widget.RecyclerView
            Android:id="@+id/recycle_view"
            Android:layout_width="match_parent"
            Android:layout_height="400dp"
            Android:background="@Android:color/darker_gray"/>
        <Android.support.v7.widget.RecyclerView
            Android:id="@+id/recycle_view_a"
            Android:layout_marginTop="40dp"
            Android:layout_below="@id/recycle_view"
            Android:layout_width="match_parent"
            Android:layout_height="400dp"
            Android:background="@Android:color/darker_gray"/>
    </RelativeLayout>

</ScrollView>
0
HungNM2

Ich habe diesen Fehler gehabt. Und meine Lösung lautet wie folgt: 

1. Erstellen Sie eine benutzerdefinierte Listenansicht, die nicht scrollbar ist  

public class NonScrollListView extends ListView {

public NonScrollListView(Context context) {
    super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();    
}

}

2. Benutze obige benutzerdefinierte Klasse für die XML-Datei

  <com.Example.NonScrollListView
        Android:id="@+id/lv_nonscroll_list"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" >
    </com.Example.NonScrollListView>

Hoffe am besten für dich.

0
Hai Rom

Bester Code

<Android.support.v4.widget.NestedScrollView
Android:id="@+id/scrollView1"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_above="@+id/btmlyt"
Android:layout_below="@+id/deshead_tv">

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
   Android:orientation="vertical"
   >

<TextView
    Android:id="@+id/des_tv"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_above="@+id/btmlyt"
    Android:background="@Android:color/white"
    Android:paddingLeft="3dp"
    Android:paddingRight="3dp"
    Android:scrollbars="vertical"
    Android:paddingTop="3dp"
    Android:text="description"
    Android:textColor="@Android:color/black"
    Android:textSize="18sp" />
</LinearLayout>

</Android.support.v4.widget.NestedScrollView>
0

Ich habe dafür eine Lösung gefunden, Anstelle von scrollview können Sie addHeaderview und addFooterview von listview verwenden.

Hier ist mein Ausschnitt,

//  create separate layout and add it dynamically
    scrollview=getLayoutInflater().inflate(R.layout.yourlayout,null);
    lv=(ListView)listview.findViewById(R.id.listView2);
    lv.addHeaderView(scrollview);
    lv.setContentView(lv);

Mit der Listenansicht kann nun auch Ihr Layout gescrollt werden. Geniesse es!!!

0
Jyoti JK

Für ListView in ScrollView verwenden Sie NestedScrollView, um diese -Funktionalität sehr einfach zu handhaben:

<Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:orientation="vertical">

            <Android.support.v7.widget.RecyclerView
                Android:id="@+id/recycler_view"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:padding="5dip"/>

        </LinearLayout>
    </Android.support.v4.widget.NestedScrollView>
0
Puneet Kumar