Listview та же высота, что и контент
Я использовал пользовательский список. Содержимое происходит от динамического, я хочу, чтобы высота же списка была такой же, как и содержимое.
Я использовал wrap_content, но это не помогает. Если я удаляю 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>
как показано ниже, я хочу, чтобы содержимое не содержало прокрутки
![enter image description here]()
Ответы
Ответ 1
Используйте этот код
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);
}
}
Ответ 2
Вы не должны помещать ListView внутри ScrollView, потому что ListView сам представляет собой группу представлений, которая отображает список прокручиваемых элементов. Если вы используете его внутри scrollview, он не получит события прокрутки, потому что все они обрабатываются родительским ScrollView. Использование ListView, чтобы сделать его не прокруткой, чрезвычайно дорого и противоречит всей цели ListView. Вы НЕ должны этого делать. Вместо этого используйте LinearLayout.
Однако, если вы действительно хотите это сделать, вы можете взглянуть на это: Как я могу поместить ListView в ScrollView без его свертывания?
Ответ 3
В родительском макете установите высоту в wrap_content
. Это должно работать.
Ответ 4
Другие предложения не будут работать, потому что нет способа определить высоту содержимого ListView до тех пор, пока он не будет выведен на экран (если, конечно, у вас нет фиксированной высоты, используйте это также как высоту 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);
}
Ответ 5
Использовать собственный пользовательский ListView
Создайте класс 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>
Ответ 6
Как отмечает Permita, у вас не должно быть ListView в Scrollview. Вместо этого вы должны использовать, например, 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();
}
}
Новый код: (мы делаем "просмотр списка" -stuff сами, чтобы по возможности использовать представления)
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());
}
UPDATE:
Или просто добавьте это к своему адаптеру и вызовите его вместо 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());
}
Ответ 7
попробуйте обернуть просмотр списка с помощью LinearLayout и установить высоту LinearLayout для wrap_content.
Ответ 8
пару вещей, чтобы отметить здесь..
- Не используйте ListView внутри ScrollView
- Вам нужно будет динамически вычислять элементы listView, чтобы получить для него высоту.
Вот функция, чтобы сделать это..
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)
}
Ответ 9
Используйте android: layout_height = "match_parent", он будет работать, я думаю.