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