-1

我想在滚动视图中有一个列表视图。这种方法做它近乎完美:https://stackoverflow.com/a/3495908/2811653滚动视图中的ListView - 小错误

有一个错误,当我在一行中输入一行文本超出:

1:http://abload.de/img/screenshot_2013-10-311jq5t.jpg

2:http://abload.de/img/screenshot_2013-10-31lvrad.jpg

滚动向下按钮工作正常,但正如你在第二个屏幕截图中看到的P无法正确显示:-(

在实用程序类中,高度计算不正确,当我像这样填充listview的第一行。

有谁知道如何解决它?

(提示:主要的一点是,我要滚动到按钮,这是列表视图下面我不希望按钮总是要被显示(所以没有权重= 1))

代码:

package com.example.tmpapplication; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public class MainActivity extends ListActivity { 

static final String[] data=new String[] 
{ 
     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 
     "B", 
     "C", 
     "D", 
     "E", 
     "F", 
     "G", 
     "H", 
     "I", 
     "J", 
     "K", 
     "L", 
     "M", 
     "N", 
     "O", 
     "P" 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setListAdapter(new ArrayAdapter<String>(this, R.layout.list, data)); 

    ListView listView=(ListView) findViewById(android.R.id.list); 
    Utility.setListViewHeightBasedOnChildren(listView); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
} 

class Utility { 
public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     // pre-condition 
     return; 
    } 

    int totalHeight = 0; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    } 
} 

XML: activity_main.xml中

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 
<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" 
android:orientation="vertical" 
> 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
</ListView> 

<Button 
    android:id="@+id/button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Button" 
    > 
</Button> 

list.xml:

<?xml version="1.0" encoding="utf-8"?> 

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:hint="text" 
    android:padding="10dp" 
    android:textSize="20sp" 
/> 
+0

不要将ListView放入ScrollView!故事结尾 – Selvin

+0

Listview有一个默认的滚动视图,所以它不需要另一个srollview。 –

+0

仔细阅读关于该链接答案的评论 - 看起来你的问题(不同的行高)已经被试图使用该代码的其他人解决了。 –

回答

0

放在一个相对布局的ListView和你的另一布局按钮。 listview本身是可滚动的,所以你不需要把你的listview放在scrollview中。这是无用的。通过将按钮的另一个布局

,你将能够轻松地滚动列表视图,和你的按钮将是布局

+0

你能举一个例子xml吗?我希望按钮直接在列表视图下 - 不管列表视图是1行还是100行。使用ScrollView是因为我不想让按钮迷路。 – NoobieNoob

+0

@NoobieNoob - 将你的listview和你的按钮放在内部布局中,并将你的按钮的layout_below属性设置为列表视图。它会工作 –

0

下清晰可见尝试这种解决方案,我贴here

如果您不希望ListView本身滚动,并且只希望ListView的高度能够显示所有元素,那么您可以创建ListView的子类来完成此操作。

public class ListViewForEmbeddingInScrollView extends ListView { 
    public ListViewForEmbeddingInScrollView(Context context) { 
     super(context); 
    } 

    public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 4, MeasureSpec.AT_MOST)); 
    } 
} 

操纵heightMeasureSpec用一个非常大的尺寸AT_MOST(Integer.MAX_VALUE的>> 4)导致的ListView来衡量所有的孩子直到给定的(非常大的)高度,并相应设置其高度。

关于这个问题有很多的讨论here包括很多关于是否适合甚至这样做的讨论。我没有足够的声誉来发布我的答案,但这比任何链接中的解决方案都要好。也许有更多声望的人会遇到这个问题,并在另一个问题上发布一个解决方案,链接到这个问题。