滚动视图中的Android列表视图

我有一个android布局,它有一个scrollView和一些元素。 在scrollView的底部,我有一个listView ,然后由适配器填充。

我遇到的问题是android从scrollView排除了listView ,因为scrollView已经有了可滚动的功能。 我想要的listView是,只要内容和主滚动视图是滚动能。

我如何实现这种行为?

这是我的主要布局:

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="2"
    android:fillViewport="true"
    android:gravity="top" >

    <LinearLayout
        android:id="@+id/foodItemActvity_linearLayout_fragments"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>

</ScrollView>

然后以编程方式将我的组件添加到带有id: foodItemActvity_linearLayout_fragments 。 以下是加载到该线性布局的视图之一。 这是给我滚动卷轴的麻烦。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
       android:id="@+id/fragment_dds_review_textView_label"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Reviews:"
       android:textAppearance="?android:attr/textAppearanceMedium" />

   <ListView
       android:id="@+id/fragment_dds_review_listView"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
   </ListView>
</LinearLayout>

我的适配器然后填写这个列表视图。

当我点击主滚动视图时,这是来自android层次结构查看器的图像:

滚动视图中的Android列表视图

正如你所看到的,它不包括评论listView。

我应该可以向下滚动页面并查看8条评论,但是它只显示了那3条,我可以在评论所在的小部分上滚动。 我想要一个全局页面滚动


ScrollView问题中ListView的最短和最简单的解决方案。

您不必在layout.xml文件中做任何特殊处理,也不需要处理父ScrollView上的任何内容。 你只需要处理子ListView。 您还可以使用此代码在ScrollView中使用任何类型的子视图并执行Touch操作。

只需在你的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);

用于ExpandableListView - 信用Benny

ExpandableListView: view = listAdapter.getView(0, view, listView);
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.MATCH_PARENT, View.MeasureSpec.EXACTLY);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.EXACTLY);
view.measure(widthMeasureSpec, heightMeasureSpec);

对于具有变量项目高度的ListView,请使用下面的链接:

ScrollView内的ListView不在Android上滚动

让图书馆直接在您的代码中实施 - 信用Paolo Rotolo

https://github.com/PaoloRotolo/ExpandableHeightListView


答案很简单,我很惊讶它还没有在这里回答。

在列表本身上使用Header View或/和Footer View 。 不要将ScrollViewListView或任何可以滚动的东西混合使用。 它的意思是与页眉和页脚一起使用:)

本质上,将所有内容放在ListView上面,将它放在另一个.xml文件中作为布局,然后在代码中将它充气并将其作为标题视图添加到列表中。

View header = getLayoutInflater().inflate(R.layout.header, null);
View footer = getLayoutInflater().inflate(R.layout.footer, null);
listView.addHeaderView(header);
listView.addFooterView(footer);

我知道它已经这么久了,但我也遇到了这个问题,试过这个解决方案并且它正在工作。 所以我想这也可以帮助其他人。

我在scrollView的layout xml中添加了android:fillViewport =“true”。 所以总体上我的ScrollView会是这样的。

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/scrollView6" 
    android:fillViewport="true">

它对我来说就像魔术一样。 位于我的ScrollView中的ListView再次展开为其大小。

以下是ScrollView和ListView的完整示例代码。

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/scrollView6" android:fillViewport="true">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        ....
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/lv_transList" android:layout_gravity="top"
            android:layout_marginTop="5dp"/>
        ....
    </LinearLayout>
</ScrollView>
链接地址: http://www.djcxy.com/p/30557.html

上一篇: Android list view inside a scroll view

下一篇: How to change the image resource of a item clicked in a list view