私はカスタムリストビューを使用しました。コンテンツは動的です。コンテンツと同じリストビューの高さにしたいのです。
私はwrap_contentを使用しましたが、これは役に立ちませんIf私はscrollviewを削除してからその作業をします
コード。 "垂直方向にスクロールするScrollViewには、別の垂直方向にスクロールするウィジェット(ListView)を含めないでください"
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/background_img"
Android:scrollbars="none" >
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<ListView
Android:id="@+id/lstsemtrack"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:divider="#f2e4e4"
Android:dividerHeight="1dip"
>
</ListView>
アイテムリスト
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
Android:padding="10dip"
Android:scrollbars="none" >
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:weightSum="4" >
<TextView
Android:id="@+id/txtBiology"
style="@style/sem_rowtext"
Android:layout_width="0dip"
Android:layout_height="wrap_content"
Android:layout_gravity="center_vertical"
Android:layout_marginRight="5dip"
Android:layout_weight="1"
Android:text="Biology" />
<TextView
Android:id="@+id/txtClass"
style="@style/sem_rowtext"
Android:layout_width="0dip"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Biology - 101" />
<TextView
Android:id="@+id/txtGrade"
style="@style/sem_rowtext"
Android:layout_width="0dip"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Grade" />
<TextView
Android:id="@+id/txtGrade"
style="@style/sem_rowtext"
Android:layout_width="0dip"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:text="Remove" />
</LinearLayout>
</LinearLayout>
以下のような出力私はコンテンツと同じようにスクロールビューなしにしたい
このコードを使用
public class MyListView extends ListView {
public MyListView (Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyListView (Context context) {
super(context);
}
public MyListView (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
ListView自体はスクロール可能なアイテムのリストを表示するビューグループであるため、ListViewをScrollView内に配置しないでください。 scrollview内で使用した場合、スクロールイベントはすべて親ScrollViewによって処理されるため、イベントを受け取りません。 ListViewを使用してスクロールしないようにすることは非常にコストがかかり、ListViewの目的全体に反します。これを行うべきではありません。代わりに、LinearLayoutを使用してください。
ただし、本当にこれを実行したい場合は、これを確認できます。 ListViewをScrollViewに折りたたみせずに配置するにはどうすればよいですか?
親レイアウトで、高さをwrap_content
に設定します。これはうまくいくはずです。
画面に描画されるまでは、ListViewのコンテンツの高さを決定する方法がないため、他の提案は機能しません(もちろん、高さが固定されている場合を除き、それをListViewの高さとしても使用します)。
あなたができることは、リストビューの高さを、その中に要素を描画した後に設定することです。アクティビティのonWindowFocusChanged
でこれを行うことができます。例として:
public void onWindowFocusChanged(boolean hasFocus) {
// get content height
int contentHeight = listView.getChildAt(0).getHeight();
// set listview height
LayoutParams lp = listView.getLayoutParams();
lp.height = contentHeight;
listView.setLayoutParams(lp);
}
独自のカスタムリストビューを使用する
クラスCustomListView.Javaを作成し、ListViewを次のように拡張します。
public class CustomListView extends ListView {
private Android.view.ViewGroup.LayoutParams params;
private int prevCount = 0;
public CustomListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas)
{
if (getCount() != prevCount)
{
int height = getChildAt(0).getHeight() + 1 ;
prevCount = getCount();
params = getLayoutParams();
params.height = getCount() * height;
setLayoutParams(params);
}
super.onDraw(canvas);
}
}
次に、それをxmlで使用します
<yourPackageName.CustomListView
Android:id="@+id/lstsemtrack"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:divider="#f2e4e4"
Android:dividerHeight="1dip">
</yourPackageName.ListView>
Permitaによって指摘されているように、ScrollviewにListViewを含めることはできません。たとえば、代わりにLinearLayoutを使用する必要があります。
場合によっては、再利用するカスタムアダプタをすでに作成していることがあります。その場合、これらのコードスニペットが役立つ場合があります。
古いビュー:
...
<ListView Android:id="@+id/myListView" ... />
...
新しいビュー:
...
<LinearLayout
Android:orientation="vertical"
Android:id="@+id/myLinearLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
...
古いコード:(ダイアログ/フラグメント/アクティビティ内)
YourAdapter listAdapter;
...
ListView listView = (ListView)rootView.findViewById(R.id.myListView);
...
if (listView != null) {
if (listAdapter == null) {
listAdapter = new YourAdapter(...);
listView.setAdapter(listAdapter);
} else {
listAdapter.notifyDataSetChanged();
}
}
新しいコード:(可能な場合はビューを再利用するために、「listview」などを自分で実行します)
YourAdapter listAdapter;
...
LinearLayout linearLayout = (LinearLayout) rootView.findViewById(R.id.myLinearLayout);
...
if (linearLayout != null) {
if (listAdapter == null) listAdapter = new YourAdapter(...);
for (int pos = 0; pos < listAdapter.getCount(); pos++) {
View existingView = linearLayout.getChildAt(pos);
if (existingView != null) listAdapter.getView(pos, existingView, linearLayout);
else linearLayout.addView(listAdapter.getView(pos, null, linearLayout));
}
while (linearLayout.getChildCount() > listAdapter.getCount()) linearLayout.removeViewAt(listAdapter.getCount());
}
更新:または、これをアダプターに追加して、リストビューでsetAdapterの代わりに呼び出し、アダプターでnotifyDataUpdatedを呼び出します。
public void updateOnLinearView(ViewGroup parentView) {
// Note reusing child views if there are any
for (int pos = 0; pos < getCount(); pos++) {
View existingView = parentView.getChildAt(pos);
if (existingView != null) getView(pos, existingView, parentView);
else parentView.addView(getView(pos, null, parentView));
}
while (parentView.getChildCount() > getCount())
parentView.removeViewAt(getCount());
}
ここで注意すべき点がいくつかあります。
これを行う関数です。
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if (listItem instanceof ViewGroup)
listItem.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
あなたは同じで呼び出す必要があります
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
setListViewHeightBasedOnChildren(listview)
}
リストビューをLinearLayoutでラップして、LinearLayoutの高さをwrap_contentに設定してみてください。