ExpandableListView
内にNestedScrollView
があります(はい、わかっています。別のスクロールビュー内にスクロールビューを置くのはよくありませんが、他に何をすべきかわかりません。教えてください。誰かがより良いアプローチを知っている場合)。
NestedScrollView
のコンテンツのサイズは画面内にあるためスクロールされませんが、ExpandableListView
が展開されると、コンテンツは画面外にリークしますが、NestedScrollView
まだスクロールしません。なぜこれがそうなのですか?
これが私のNestedScrollView
レイアウトです:
<NestedScrollView>
<LinearLayout>
<LinearLayout></LinearLayout>
... // About 3 of the LinearLayouts
<ExpandableListView/>
</LinearLayout>
</NestedScrollView>
NonScrollExpandableListView
を使用できます。以下のメソッドをオーバーライドすることにより、Lisview
またはGridView
またはExpandableListView
の非スクロールプロパティを実現できます。
@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();
}
したがって、NonScrollExpandableListView
を使用するには、1つのカスタムクラスを作成する必要があります。
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();
}
}
そしてそれを好きに使ってください。
<com.example.extraclasses.NonScrollExpandableListView
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
ハッピーコーディング。
V-rund Puro-hit からの答えが私にとってうまくいきました。しかし、KotlinがサポートするAPI> 19で動作するには、いくつかの変更が必要でした。誰かの時間を節約するために、ここにそれがあります:
新しいクラスファイルNonScrollExpandableListView
を作成します。
import Android.content.Context
import Android.util.AttributeSet
import Android.widget.ExpandableListAdapter
import Android.widget.ExpandableListView
class NonScrollExpandableListView : ExpandableListView {
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}
override fun setAdapter(adapter: ExpandableListAdapter?) {
super.setAdapter(adapter)
}
override fun setOnChildClickListener(onChildClickListener: OnChildClickListener) {
super.setOnChildClickListener(onChildClickListener)
}
override fun expandGroup(groupPos: Int) : Boolean {
return super.expandGroup(groupPos)
}
override fun expandGroup(groupPos: Int, animate: Boolean) : Boolean {
return super.expandGroup(groupPos, animate)
}
override fun isGroupExpanded(groupPosition: Int): Boolean {
return super.isGroupExpanded(groupPosition)
}
public override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE shr 2, MeasureSpec.AT_MOST)
super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom)
val params = layoutParams
params.height = measuredHeight
}
}
...そして私はそれを次のように使用します:
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<com.example.you.kotlinlistview.NonScrollExpandableListView
Android:id="@+id/expandableCategories"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
/>
<Button
Android:id="@+id/add_new_feed"
Android:drawableStart="@drawable/ic_add"
Android:layout_width="match_parent"
Android:layout_height="50dp"
Android:text="Add new feed"
/>
<Button
Android:id="@+id/settings_button"
Android:drawableStart="@drawable/ic_settings"
Android:layout_width="match_parent"
Android:layout_height="50dp"
Android:text="Settings"
/>
<Button
Android:id="@+id/logout_button"
Android:drawableStart="@drawable/ic_exit"
Android:layout_width="match_parent"
Android:layout_height="50dp"
Android:text="Log Out"
/>
</LinearLayout>
</ScrollView>
その結果、ボタンやその他の要素をNavigationView
サイドドロワーに快適に追加できます)、すべての機能が1つの共通のScrollView
でうまく機能します。ここでの主な使用法は、複数のListView
sとExpandableListView
sを、スクロールを処理する1つの共通のScrollView
内で組み合わせる必要がある場合です。
このメソッドを使用すると、実行時にExpendableListSizeが計算されます。
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();
}
以下のようにsetOnGroupClickListenerでこのメソッドを呼び出します。
mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
setListViewHeight(parent, groupPosition);
return false;
}
});
追加 Android:nestedScrollingEnabled="true"
をExpandalbleListViewレイアウトに追加します。
Scrollview内では、listview、gridview、expandable listviewは使用できません。 scrollview内で拡張可能なリストビューを使用したくない場合は、拡張可能なリストビューに一定の高さを与える必要があります。