将ListView放置在Android中的其他视图下方

时间:2017-01-22 11:40:30

标签: android android-layout listview scroll android-scrollview

我一直在尝试在Android中的其他一些视图下放置一个列表视图。 例如。

我有一个Scrollview,我将其他视图包含在ListView

我希望列表视图长达1000dp,以便用户可以滚动到Listview并滚动布局中的列表。

我已经在这2天了。任何帮助将受到高度赞赏。 这是我的代码

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true" >

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginBottom="50dip"
    >

    <TextView
        android:id="@+id/tvheading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="2dp"
        android:gravity="center"
        android:text="@string/title_AllSensorhead"
        android:textStyle="bold" />

    <View
        style="@style/Divider"
        android:layout_above="@+id/listView" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_horizontal"
        android:indeterminateDrawable="@drawable/progress"
        android:visibility="gone" />


    <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_gravity="center" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark"
        android:orientation="vertical"
        android:padding="8dp">

        <TextView
            android:id="@+id/textSensorName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginLeft="2dp"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/black"
            android:textSize="20dp"
            android:textStyle="bold" />


        <TextView
            android:id="@+id/textSensorNo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/white"
            android:textSize="15dp"
            android:textStyle="bold" />

    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="1000dip"
        android:layout_marginTop="5dip"
        >
    </ListView>


</LinearLayout>

3 个答案:

答案 0 :(得分:0)

使用滚动视图包含所有android xml文件....定义布局应该是可滚动的而不是线性布局....

答案 1 :(得分:0)

只需在java类中添加以下代码行:

ListView lv = (ListView) findViewById(R.id.layout_lv);
lv.setOnTouchListener(new OnTouchListener() {
    // Setting on Touch Listener for handling the touch inside ScrollView
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Disallow the touch request for parent scroll on touch of child view
        v.getParent().requestDisallowInterceptTouchEvent(true);
        return false;
    }
});

如果您将 ListView放在ScrollView 中,那么所有 ListView都不会拉伸到其全高。以下是解决此问题的方法。

/**** Method for Setting the Height of the ListView dynamically.
 **** Hack to fix the issue of not showing all the items of the ListView
 **** when placed inside a ScrollView  ****/
public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null)
        return;

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0)
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));

        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

要使用此方法,只需在此方法中传递ListView:

ListView list = (ListView) view.findViewById(R.id.ls);
setListViewHeightBasedOnChildren(list);

告诉我它是否适合你=)。

答案 2 :(得分:0)

可以为您的问题找到一种可能的解决方案..

据我所知,您只想滚动整个屏幕,其中包含listview ..

因此,首先创建一个不同的布局名称,如header_listview.xml

将你的代码与listview区分开来。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginBottom="50dip"
    >

    <TextView
        android:id="@+id/tvheading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="2dp"
        android:gravity="center"
        android:text="@string/title_AllSensorhead"
        android:textStyle="bold" />

    <View
        style="@style/Divider"
        android:layout_above="@+id/listView" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_horizontal"
        android:indeterminateDrawable="@drawable/progress"
        android:visibility="gone" />


    <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_gravity="center" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark"
        android:orientation="vertical"
        android:padding="8dp">

        <TextView
            android:id="@+id/textSensorName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginLeft="2dp"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/black"
            android:textSize="20dp"
            android:textStyle="bold" />


        <TextView
            android:id="@+id/textSensorNo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="@color/white"
            android:textSize="15dp"
            android:textStyle="bold" />

    </LinearLayout>    
</LinearLayout>

现在您的列表视图布局可以简单地像

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="1000dip"
        android:layout_marginTop="5dip"
        />

在胖文件列表实例中的java文件中.. 在那里添加两行

View headerView= LayoutInflater.from(this).inflate(R.layout.header_listview,null,false);
    listView.addHeaderView(headerView;

你可以获得那些TextViews&amp;进度条和这个标题视图中的图表...似乎

TextView txt=(TextView) headerView.findViewById(R.id.tvheading);

从这种方法来看,用listivew违反scrollview不会到达, 你也不需要给listview提供1000dip修复高度.. 请告诉我们是否需要更多帮助.. 如果有帮助,请欣赏..