70

我正在尝试制作这样的布局:

问题是我不希望ListViews是可滚动的。我希望它们尽可能高,并使整个屏幕可滚动。如果我将高度设置ListViewwrap_content,那是行不通的。使它工作的唯一方法是设置一个特定的高度 - 但我不知道ListView.

我知道我不应该放在ListView里面ScrollView- 但我不希望它ListView是可滚动的,只是为了显示所有项目。

也许有更好的方法让它工作?

4

7 回答 7

157

您创建不可滚动的自定义 ListView

public class NonScrollListView extends ListView {

    public NonScrollListView(Context context) {
        super(context);
    }
    public NonScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                    Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();    
    }
}

在您的布局资源文件中

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fadingEdgeLength="0dp"
    android:fillViewport="true"
    android:overScrollMode="never"
    android:scrollbars="none" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <!-- com.Example Changed with your Package name -->

        <com.Example.NonScrollListView
            android:id="@+id/lv_nonscroll_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </com.Example.NonScrollListView>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/lv_nonscroll_list" >

            <!-- Your another layout in scroll view -->

        </RelativeLayout>
    </RelativeLayout>

</ScrollView>

在 Java 文件中

创建 customListview 的对象,而不是 ListView,例如:
NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list);

于 2014-07-08T10:21:45.827 回答
10

根本不需要使用 a listview

如果您真的考虑过,在您的情况下 alistview可以替换为 a LinearLayout。这Adapter将是相同的,但是不是将适配器附加到您的listview,只需getView在数据的 for 循环中调用适配器的函数并将检索到的视图添加到您的 vertical linearlayout

但是,仅当列表中有少量项目并且这些项目的显示表示不是内存密集型时才建议使用此方法。

于 2013-09-15T15:14:41.923 回答
2

最好的方法(2017 年)是使用 aRecyclerViewNestedScrollView.

不需要任何黑客攻击,它可以像您想要的那样开箱即用。

于 2017-02-22T18:58:31.097 回答
0

好吧,有一个很酷的 Android 人,名叫 Mark Murphy,又名 CommonsWare,他构建了一个非常有用的组件,名为CWAC Merge Adapter,它可以让你做你需要的事情。您需要动态添加视图,而不是从 XML 中添加;但考虑到您的简单用户界面,这应该不是问题。当我不知道应该滚动哪种数据时,我将其用于此类情况。

如果您不想使用它(可能出于许可原因),您可以在那里有一个列表视图(而不是那两个连续的列表视图)和 override ,getItemViewsCount以便提供上述布局。如果您在 Google 上搜索,您会发现有用的信息。例如这个链接,或者这个getItemViewTypegetViewandroid listview different rows

但是,我会选择合并适配器。

于 2013-09-15T14:22:36.200 回答
0

选择您想要滚动的 ListView,然后添加方法 'setOnTouchListener' 以自动将滚动插入到 ListView 中

final ListView listview = (ListView) findViewById(R.id.list);


    listview.setOnTouchListener(new ListView.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            int action = event.getAction();
            switch (action)
            {
                case MotionEvent.ACTION_DOWN:
                    // Disallow ScrollView to intercept touch events.
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    break;

                case MotionEvent.ACTION_UP:
                    // Allow ScrollView to intercept touch events.
                    v.getParent().requestDisallowInterceptTouchEvent(false);
                    break;
            }

            // Handle ListView touch events.
            v.onTouchEvent(event);
            return true;
        }
    });
    listview.setClickable(true);

我希望这对你有用

于 2017-09-05T18:54:04.747 回答
0

如果可以计算您的项目高度/宽度,我有一个简单的解决方案......您只需要创建 ListView 的父线性布局,然后从 Java 中固定父高度。

在此处输入图像描述

假设您需要设计此视图...现在父布局大小是从 java 定义的...

final LinearLayout parent=(LinearLayout)findViewById(R.id.parent);
final ListView  listview=(ListView)findViewById(R.id.listview);
parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp )));
//number_of_item_in_list is list side ~ listArray.size();
//per_item_size_in_dp = calculate item size in dp. Ex: 80dp

public static int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

就这样 :)

于 2016-03-20T11:49:14.023 回答
0
  1. How to scroll listView In scrollView

    listViewName.setOnTouchListener(new ListView.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
          case MotionEvent.ACTION_DOWN:
            // Disallow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;
          case MotionEvent.ACTION_UP:
            // Allow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
        }
        // Handle ListView touch events.
        v.onTouchEvent(event);
        return true;
      }
    });
    listViewName.setClickable(true);
    
于 2021-09-14T09:33:08.853 回答