我使用自定义列表视图。内容来自动态我希望与内容相同的列表视图高度。
我使用了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>
输出如下所示我想要内容没有scrollview
答案 0 :(得分:33)
使用此代码
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);
}
}
答案 1 :(得分:11)
您不应将ListView放在ScrollView中,因为ListView本身是一个显示可滚动项列表的视图组。如果在scrollview中使用它,它将不会接收滚动事件,因为它们都由父ScrollView处理。使用ListView使其不滚动是非常昂贵的,并违背ListView的整个目的。你不应该这样做。只需使用LinearLayout。
但是,如果你真的想这样做,你可以看一下:How can I put a ListView into a ScrollView without it collapsing?
答案 2 :(得分:7)
在您的父版面中,将高度设置为wrap_content
。这应该有用。
答案 3 :(得分: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);
}
答案 4 :(得分:2)
使用自己的自定义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>
答案 5 :(得分:1)
如Permita所述,您不应在Scrollview中拥有ListView。您应该使用例如LinearLayout。
在某些情况下,您已经制作了要重复使用的自定义适配器。在这种情况下,这些代码片段可能很有用。
旧观点:
var slider = document.getElementById('sliderInput');
var main = document.getElementById('mainContainer');
setViewPort(slider.value);
slider.oninput = function(){
setViewPort(this.value);
}
slider.onclick = function(){
alert('clicked!');
}
//For sliding
function setViewPort(pourcentage){
var width = main.offsetWidth*(pourcentage/100);
document.getElementById('containerImgSliding').style.width = width+'px';
}
新观点:
...
<ListView android:id="@+id/myListView" ... />
...
旧代码:(在dialog / fragment / activity中)
...
<LinearLayout
android:orientation="vertical"
android:id="@+id/myLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
...
新代码:(自己做一些“listview” - 如果可能的话重用视图)
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();
}
}
更新: 或者只是将其添加到您的适配器并在列表视图上调用它而不是setAdapter,并在适配器上调用notifyDataUpdated:
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());
}
答案 6 :(得分:0)
尝试使用LinearLayout包装列表视图,并将LinearLayout的高度设置为wrap_content。
答案 7 :(得分:0)
这里要注意的几件事。
这是一个执行此操作的功能。
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)
}
答案 8 :(得分:0)
问题是“ ScrollView”中的“ ListView”
ListView已经具有自动滚动功能,因此您可以将其删除
答案 9 :(得分:-2)
使用android:layout_height =“match_parent”,我认为它会起作用。