ScrollView 和设置布局的问题

Issues with ScrollView and setting layouts

我是 android 开发的新手。不明白的地方请不要介意。

我对这个问题做了足够的研究,在将其标记为重复之前,请更新解决方案。

我在这里添加了一张图片,其中包含我想要在此处实现的布局安排。

此处 listView 仅显示为 1 项。如果我滚动,所有项目都将滚动到此高度。

我的xml结构是

<LinearLayout>(parent)
     <ScrollView>
          <LinearLayout>
               <LinearLayout>
                weight: __
                -----------
               </LinearLayout>
               <ListView>
                   h:match_parent
                   w:wrap_content
                   weight:__
               </ListView>
               <LinearLayout>
                   weight:__
                --------------
               </LinearLayout>
          </LinearLayout>
     </ScrollView>
</LinearLayout>

我正在从数据库中获取大量数据集,并且必须在两者的中间显示这些数据集 LinearLayouts。现在我正在使用 ListView 但似乎不可能像我期望的那样在这里使用。

请建议我是否可以在此处执行 ListView 或如何为每个数据集使用 LinearLayout 块的数量?

更新 这就是我所期望的,如图所示。

可能需要进一步说明您要完成的具体目标。

如果 ListView 应该更长并且滚动浏览列表中的更多项目,我可能建议使用 RecyclerView。它的设置有点多,但允许根据概念创建更复杂的布局。

如果您想进一步搜索,有很多很好的参考资料可以学习 RecyclerView 的方法:

试试这个方法

<LinearLayout>   
      <LinearLayout>
           <LinearLayout>
            weight: __
            -----------
           </LinearLayout>
           <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <ListView>
               h:match_parent
               w:wrap_content
               weight:__
            </ListView>
           </ScrollView>
           <LinearLayout>
               weight:__
            --------------
           </LinearLayout>
      </LinearLayout>

试试这个

<LinearLayout>(parent)
     <NestedScrollView>
          <LinearLayout>
               <LinearLayout>                    
                w:wrap_content
                h:wrap_content
               </LinearLayout>
               <ListView>
                   w:match_p__arent
                   h:match_p__arent
                   weight:1
                   NestedScroll:true
               </ListView>
               <LinearLayout>
                   w:match_p__arent
                   h:match_p__arent
                   weight:1 
               </LinearLayout>
          </LinearLayout>
     </NestedScrollView>
</LinearLayout>


我已经在我的 Android 工作室中尝试过了,我的工作正常,我可以滚动视图。我的比你的稍微差一点。

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

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent">

        <LinearLayout
            android:id="@+id/first"
            android:layout_width="match_parent"
            android:layout_height="50dp"

            android:background="@color/colorAccent"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:text="@string/hello" />

        </LinearLayout>

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:background="@color/black_overlay"
            android:layout_below="@+id/first" />

        <LinearLayout
            android:id="@+id/second"
            android:layout_width="match_parent"
            android:layout_height="550dp"

            android:background="@color/colorAccent"
            android:layout_below="@+id/listview"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:text="@string/hello" />

        </LinearLayout>


    </RelativeLayout>


</ScrollView>

您的 ListView 需要此方法

    public static void setListViewHeightBasedOnItems(ListView target_Listview, int limit) // LIMIT 0 FOR SHOWING ALLL CONTENTS
{
    if (limit == 0) {
        ListAdapter listAdapter = target_Listview.getAdapter();
        if (listAdapter != null) {

            int numberOfItems = listAdapter.getCount();

            // Get total height of all items.
            int totalItemsHeight = 0;
            for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
                //                if(itemPos < 4)
                //                {
                View item = listAdapter.getView(itemPos, null, target_Listview);
                item.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
                Log.e("" + itemPos, "" + item.getMeasuredHeight());
                totalItemsHeight += item.getMeasuredHeight();
                //                }
            }

            // Get total height of all item dividers.
            int totalDividersHeight = target_Listview.getDividerHeight() * (numberOfItems - 1);

            // Set list height.
            ViewGroup.LayoutParams params = target_Listview.getLayoutParams();
            params.height = totalItemsHeight + totalDividersHeight;
            target_Listview.setLayoutParams(params);
            target_Listview.requestLayout();

            //  return true;

        }
        else {

        }
    }
    else {
        ListAdapter listAdapter = target_Listview.getAdapter();
        if (listAdapter != null) {

            int numberOfItems = listAdapter.getCount();

            // Get total height of all items.
            int totalItemsHeight = 0;
            for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
                if (itemPos < limit) {
                    View item = listAdapter.getView(itemPos, null, target_Listview);
                    item.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
                    Log.e("" + itemPos, "" + item.getMeasuredHeight());
                    totalItemsHeight += item.getMeasuredHeight();
                }
            }

            // Get total height of all item dividers.
            int totalDividersHeight = target_Listview.getDividerHeight() * (numberOfItems - 1);

            // Set list height.
            ViewGroup.LayoutParams params = target_Listview.getLayoutParams();
            params.height = totalItemsHeight + totalDividersHeight;
            target_Listview.setLayoutParams(params);
            target_Listview.requestLayout();
        }


    }
}

ListView 上设置适配器后,只需调用该方法并在参数中传递 ListView,并将列表大小作为第二个参数。

One Suggestion from my side :您应该使用 RecyclerView 而不是 listview 。设置完所有内容(适配器等)后只需要为此写一行

recyclerView.HasFixedSize();

希望我的回答对您有所帮助。