【问题标题】:Can't scroll ListView in its parent NestedScrollView - Android无法在其父 NestedScrollView 中滚动 ListView - Android
【发布时间】:2016-08-23 15:04:19
【问题描述】:

我在NestedScrollView 中使用ListView,但在ListView 中看不到超过1 项。我可以滚动到 TextView (textContact) 的末尾,但不能在 ListView (listContact) 内滚动。

这是 .xml 文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    ... >
    <android.support.design.widget.CoordinatorLayout
        ... >    
        <LinearLayout
            ...
            android:orientation="vertical">

            <android.support.v7.widget.Toolbar
                ... />
            <android.support.v4.widget.NestedScrollView
                ... >
                <LinearLayout
                    ...
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/textContact"
                        ... />
                    <LinearLayout
                        ...
                        android:orientation="vertical">
                        <ListView
                            android:id="@+id/listContact"
                            ... />
                    </LinearLayout>
                </LinearLayout>

            </android.support.v4.widget.NestedScrollView>

        </LinearLayout>

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        ... />

</android.support.v4.widget.DrawerLayout>

是否存在设计问题、此处使用的小部件/控件的兼容性问题或其他任何问题?

【问题讨论】:

    标签: java android listview scroll android-nestedscrollview


    【解决方案1】:

    您需要在NestedScrollView中启用以下两个属性,

    <android.support.v4.widget.NestedScrollView xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    

    然后使用辅助类来扩展 ListView 宽度并修复滚动功能,

    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    
    public class Helper {
        public static void getListViewSize(ListView myListView) {
            ListAdapter myListAdapter = myListView.getAdapter();
            if (myListAdapter == null) {
                //do nothing return null
                return;
            }
            //set listAdapter in loop for getting final size
            int totalHeight = 0;
            for (int size = 0; size < myListAdapter.getCount(); size++) {
                View listItem = myListAdapter.getView(size, null, myListView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }
          //setting listview item in adapter
            ViewGroup.LayoutParams params = myListView.getLayoutParams();
            params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1));
            myListView.setLayoutParams(params);
            // print height of adapter on log
            Log.i("height of listItem:", String.valueOf(totalHeight));
        }
    }
    

    要在设置 ListView 适配器时使用帮助器类,

    listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listview_array));
                  Helper.getListViewSize(listView);
    

    PS:确保您已经为您的项目添加了支持设计库。

    compile 'com.android.support:design:23.4.0'
    

    【讨论】:

    • 哪一个 LinearLayout 应该有这些属性? 1. Toolbar 上方 2. NestedScrollView 下方 3. ListView 外 哪个 LinearLayout ?
    • 一个包含ListView
    • 它将 ListView 从显示 1 项扩展到多个。但问题还没有解决。如果 TextView 在屏幕大小的一半左右完成,则可以看到完整的 ListView。但是如果 ListView 在 Activity Start 时不可见,则无法滚动。只有我能够滚动的是 TextView 而不是 ListView。
    • 单行时对我有用,但在查看多个内容时不起作用。
    • 完美运行。但它在第一次加载时闪烁
    【解决方案2】:

    在您的listview 上使用ViewCompat.setNestedScrollingEnabled(),您的问题应该会得到解决。

    【讨论】:

      【解决方案3】:

      我认为,你的布局设计很糟糕,你应该重新设计它。通常,您不应该在另一个可滚动视图(如 NestedScrollViewScrollView)中拥有像 ListView 这样的可滚动视图。你真的需要那个吗?尝试改变它,扁平化你的视图结构,这个问题应该会消失。

      【讨论】:

      • 是的,我想要公司的信息,然后为社交按钮自定义 ListView,而不是为每个社交网络添加按钮。所以如果可能的话会更好。
      【解决方案4】:
        <android.support.v7.widget.RecyclerView
              android:id="@+id/recycler"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              app:layout_behavior="@string/appbar_scrolling_view_behavior"
              android:clipToPadding="false" >
             </android.support.v7.widget.RecyclerView>
      

      你是否缺少 app:layout_behavior

      【讨论】:

      • 首先,我没有使用 RecyclerView,其次,通过添加该属性,现在只扩展了 ListView。但如果它在 Activity 启动时离开屏幕,那么我无法通过滚动看到完整的 ListView,再次只有第一项可见。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2019-05-05
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多