web-dev-qa-db-fra.com

Liste de diffusion extensible dans scrollview

J'ai peu de contenus suivis par Expandablelistview.Je ne parviens pas à faire défiler toute la mise en page. Je cherche une réponse appropriée depuis plus d'une semaine .. Suggérez quelques réponses.

8
Satty

Premièrement, je suppose que vous n'utilisez pas plus d'une disposition enfant dans une vue de défilement, car une vue de défilement ne peut avoir qu'un seul enfant direct.

Deuxièmement, vous ne devez utiliser aucun composant de défilement tel qu'une liste extensible, dans une vue de défilement , Voici pourquoi ListView dans ScrollView ne défile pas sous Android .

3
ask_aks

Cette solution a fonctionné pour moi lorsque j'ai utilisé une disposition personnalisée dans la vue de navigation avec une vue de défilement avec LinearLayout qui possède une liste de diffusion extensible.

<Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:headerLayout="@layout/nav_header">
    <ScrollView
            Android:fillViewport="true"
            Android:layout_marginTop="130dp"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content">
            <LinearLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:orientation="vertical">

                <LinearLayout
                    Android:id="@+id/homeLayout"
                    Android:clickable="true"
                    Android:gravity="center_vertical"
                    Android:background="@drawable/layout_click_effect"
                    Android:layout_width="match_parent"
                    Android:layout_height="45dp">

                    <ImageView
                        Android:id="@+id/homeIv"
                        Android:layout_width="45dp"
                        Android:layout_height="wrap_content"
                        Android:src="@mipmap/ic_home_black_24dp" />

                    <TextView
                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:text="Home" />
                </LinearLayout>
                <View
                    Android:background="@Android:color/darker_gray"
                    Android:layout_width="match_parent"
                    Android:layout_height="1dp"/>

                <ExpandableListView
                    Android:id="@+id/topCatgExpLv"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_gravity="start"
                    Android:groupIndicator="@null"
                    Android:dividerHeight="1dp" />
        </ScrollView>


    </Android.support.design.widget.NavigationView>

Dans votre onCreate

mListView = (ExpandableListView) findViewById(R.id.activity_expandable_list_view);
    MyExpandableListAdapter adapter = new MyExpandableListAdapter(this,
            mGroups);
    mListView.setAdapter(adapter);
    mListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

        @Override
        public boolean onGroupClick(ExpandableListView parent, View v,
                                    int groupPosition, long id) {
            setListViewHeight(parent, groupPosition);
            return false;
        }
    });

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

}
13
Amit Tumkur

vous pouvez le faire très simple. définissez votre hauteur de vue de défilement sur wrap_content. définissez votre hauteur de vue racine dans la vue de défilement comme wrap_content (telle que la présentation linéaire) et définissez votre vue liste extensible sur wrap_content. Après cela, définissez OnGroupExpandListener et OnGroupCollapseListener pour votre vue liste extensible et définissez la hauteur pour cela tant que l'enfant de la vue liste extensible. comme ce code: votre mise en page:

<ScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/scrollViewDrawer"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:fillViewport="true"
>
<LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    Android:background="@color/mainGray"
    >
 <ExpandableListView
    Android:id="@+id/expandableListCategory"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
                />
 </LinearLayout>
 </ScrollView>

et ceci est votre fragment: (ou dans votre activité)

public class DrawerFragment extends Fragment implements, OnGroupExpandListener, OnGroupCollapseListener{
ScrollView scrollView;
ExpandableListView expListView;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
view rootView = inflater.inflate(R.layout.fragment_layout, container, false);
scrollView = (ScrollView) rootView.findViewById(R.id.scrollViewDrawer);
expListView = (ExpandableListView) rootView.findViewById(R.id.expandableListCategory);
....
}
@Override
public void onGroupExpand(int groupPosition) {
    LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) expListView.getLayoutParams();
    param.height = (childCount * expListView.getHeight());
    expListView.setLayoutParams(param);
    expListView.refreshDrawableState();
    scrollView.refreshDrawableState();
}

@Override
public void onGroupCollapse(int groupPosition) {
    LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) expListView.getLayoutParams();
    param.height = LinearLayout.LayoutParams.WRAP_CONTENT;
    expListView.setLayoutParams(param);
    expListView.refreshDrawableState();
    scrollView.refreshDrawableState();
}
6
Saber Solooki

Je sais que la question est assez ancienne, mais peut-être sera-t-elle utile pour quelqu'un. En gros, ma réponse est une combinaison des réponses d’Amit Tumkur et d’utilisateur2141833. Après beaucoup d'essais et d'erreurs, le code suivant fonctionne pour moi: 

Calculez d’abord la hauteur initiale de la vue de liste extensible, c’est-à-dire lorsque tout est réduit.

    for (Integer i = 0; i < mAdapter.getGroupCount(); i++) {
        View groupItem = mAdapter.getGroupView(i, false, null, mExpandableListView);
        groupItem.measure(mExpandableListView.getWidth(), View.MeasureSpec.UNSPECIFIED);
        mInitialHeight += groupItem.getMeasuredHeight();
    }

Ensuite, lorsque le groupe est cliqué, définissez la hauteur de la vue Liste extensible sur le contenu intégré.

    mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            //Other Expansion/Collapsing Logic
            setListHeightToWrap();
            return true;
        }
    });

setListHeightToWrap est une méthode différente:

private void setListHeightToWrap() {
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mExpandableListView.getLayoutParams();
    params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    mExpandableListView.setLayoutParams(params);
    mExpandableListView.refreshDrawableState();
    mScrollView.refreshDrawableState();
}

Ensuite, dans OnGroupExpandListener, définissez la hauteur de la vue de liste extensible comme suit:

    mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
        @Override
        public void onGroupExpand(int groupPosition) {
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mStitchingWorksListView.getLayoutParams();
            //The Logic here will change as per your requirements and the height of each of the children in the group
            if (mAdapter.getRealChildrenCount(groupPosition) > 6) {
                params.height = 9 * mInitialHeight;
            } else {
                params.height = 6 * mInitialHeight;
            }
            //For Last Group in the list and the number of children were less as compared to other groups
            if (groupPosition == mAdapter.getGroupCount() - 1) {
                params.height = 3 * mInitialHeight;
            }
            mExpandableListView.setLayoutParams(params);
            mExpandableListView.refreshDrawableState();
            mExpandableListView.refreshDrawableState();
        }
    });

La disposition était également ExpandableListView dans LinearLayout dans ScrollView.

J'espère que ça aide quelqu'un. :)

2
Varun Ramani

Pour les utilisateurs qui recherchent une liste de vues extensible dans scrollview, utilisez les vues au lieu de liste extensible, suivez le lien et le code ci-dessous. 

enter image description here

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <LinearLayout
        Android:id="@+id/linear_listview"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" />

</ScrollView>

Et en classe Java quelque chose comme ça-

for (int i = 0; i < pProductArrayList.size(); i++) {

            LayoutInflater inflater = null;
            inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View mLinearView = inflater.inflate(R.layout.row_first, null);

            final TextView mProductName = (TextView) mLinearView.findViewById(R.id.textViewName);
            final RelativeLayout mLinearFirstArrow=(RelativeLayout)mLinearView.findViewById(R.id.linearFirst);
            final ImageView mImageArrowFirst=(ImageView)mLinearView.findViewById(R.id.imageFirstArrow);
            final LinearLayout mLinearScrollSecond=(LinearLayout)mLinearView.findViewById(R.id.linear_scroll);

            if(isFirstViewClick==false){
            mLinearScrollSecond.setVisibility(View.GONE);
            mImageArrowFirst.setBackgroundResource(R.drawable.arw_lt);
            }
            else{
                mLinearScrollSecond.setVisibility(View.VISIBLE);
                mImageArrowFirst.setBackgroundResource(R.drawable.arw_down);
            }

            mLinearFirstArrow.setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {

                    if(isFirstViewClick==false){
                        isFirstViewClick=true;
                        mImageArrowFirst.setBackgroundResource(R.drawable.arw_down);
                        mLinearScrollSecond.setVisibility(View.VISIBLE);

                    }else{
                        isFirstViewClick=false;
                        mImageArrowFirst.setBackgroundResource(R.drawable.arw_lt);
                        mLinearScrollSecond.setVisibility(View.GONE);   
                    }
                    return false;
                } 
            });
1
Manish Srivastava

Plese, essayez ceci une fois.

1) Ajoutez cette ligne setExpandableListViewHeight (expandableListViewCategories) juste après la configuration de votre adaptateur.

 expandableListCategoriesAdapter = new ExpandableListCategoriesAdapter(getActivity(), listDataHeader, listDataChild); 
 expandableListViewCategories.setAdapter(expandableListCategoriesAdapter);
 expandableListCategoriesAdapter.notifyDataSetChanged();
 setExpandableListViewHeight(expandableListView);

2) Copiez le contenu ci-dessous et collez-le dans la méthode setExpandableListViewHeight ().

private void setExpandableListViewHeight(ExpandableListView listView) {
        try {
            ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter();
            int totalHeight = 0;
            for (int i = 0; i < listAdapter.getGroupCount(); i++) {
                View listItem = listAdapter.getGroupView(i, false, null, listView);
                listItem.measure(0, 0);
                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();
            scrollBody.post(new Runnable() {
                public void run() {           
                    scrollBody.fullScroll(ScrollView.FOCUS_UP);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Remarque: Ceci mettra automatiquement votre ExpandableListView hors service et vous pourrez faire défiler l'affichage en plein écran.

0
Surendar D

Entrez le code ci-dessous adapteSet

enter code hereListAdapter listAdapter = listView.getAdapter();
 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);
 listView.requestLayout();
0
vaisakh mv