web-dev-qa-db-fra.com

Android - NestedScrollView qui contient ExpandableListView ne défile pas lorsqu'il est développé

J'ai une ExpandableListView dans une NestedScrollView (oui je sais, ce n'est pas bon d'avoir une vue défilante dans une autre vue défilante mais je ne sais pas quoi faire d'autre, merci de me dire si quelqu'un connaît une meilleure approche).

La taille du contenu dans NestedScrollView est toujours présente à l'écran, elle ne défilera donc pas. Toutefois, lorsque ExpandableListView est développé, le contenu s'échappe de l'écran mais la NestedScrollView ne défilera toujours pas .. Pourquoi?

Voici ma mise en page NestedScrollView:

<NestedScrollView>
    <LinearLayout>
        <LinearLayout></LinearLayout>
        ... // About 3 of the LinearLayouts
        <ExpandableListView/>
    </LinearLayout>
</NestedScrollView>
10
Kevin Murvie

Vous pouvez utiliser NonScrollExpandableListView pour obtenir la propriété non-scroll de toute variable Lisview ou GridView ou ExpandableListView en remplaçant la méthode suivante.

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

Donc, pour utiliser NonScrollExpandableListView, vous devez créer une classe personnalisée.

public class NonScrollExpandableListView extends ExpandableListView {

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

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

    public NonScrollExpandableListView(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();
    }
}

Et utilisez-le comme.

<com.example.extraclasses.NonScrollExpandableListView 

    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" /> 

Bonne codage.

47
V-rund Puro-hit

Utilisez cette méthode pour calculer ExpendableListSize au moment de l'exécution.

 private void setListViewHeight(ExpandableListView listView,
                               int group) {
    ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter();
    int totalHeight = 0;
    int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(),
            View.MeasureSpec.EXACTLY);
    for (int i = 0; i < listAdapter.getGroupCount(); i++) {
        View groupItem = listAdapter.getGroupView(i, false, null, listView);
        groupItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);

        totalHeight += groupItem.getMeasuredHeight();

        if (((listView.isGroupExpanded(i)) && (i != group))
                || ((!listView.isGroupExpanded(i)) && (i == group))) {
            for (int j = 0; j < listAdapter.getChildrenCount(i); j++) {
                View listItem = listAdapter.getChildView(i, j, false, null,
                        listView);
                listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);

                totalHeight += listItem.getMeasuredHeight();

            }
        }
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    int height = totalHeight
            + (listView.getDividerHeight() * (listAdapter.getGroupCount() - 1));
    if (height < 10)
        height = 200;
    params.height = height;
    listView.setLayoutParams(params);
    listView.requestLayout();

}

Un appel de cette méthode dans votre setOnGroupClickListener.like ci-dessous

mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

            setListViewHeight(parent, groupPosition);
            return false;
        }
    });
3
Pawan kumar sharma

Nous ne pouvons pas utiliser listview, gridview ou listview extensible dans scrollview. Si vous ne souhaitez pas utiliser la liste déroulante extensible dans scrollview, vous devez attribuer une hauteur fixe à votre liste déroulante.

1
Kumar M

Ajoutez Android:nestedScrollingEnabled="true" à votre mise en page ExpandalbleListView.

0
Paweł B