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>
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.
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;
}
});
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.
Ajoutez Android:nestedScrollingEnabled="true"
à votre mise en page ExpandalbleListView.