ScrollView中的不可滚动ListView


70

我试图做这样的布局:

问题是我不希望ListViews滚动。我希望它们达到所需的高度,并使整个屏幕可滚动。如果我将的高度设置ListViewwrap_content,则无法使用。使它起作用的唯一方法是设置一个特定的高度-但我不知道其中有多少个项目ListView

我知道我不应该把ListViewScrollView-但我不希望ListView是滚动的,只是为了显示所有项目。

也许有更好的方法可以使它起作用?

Answers:


155

您创建不滚动的自定义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);


2
当将其交换到现有的代码库中时,添加新类后可能只需要修改XML。大多数将实例强制转换为的引用(ListView)仍然可以正常工作。
rymo 2014年

1
@DEV请实际提供详细信息,您需要哪种类型的布局
Dedaniya HirenKumar 2014年

3
@Dedaniyahirenkumar,当android显示包含的布局时NonScrollListView,父级ScrollView将滚动到的顶部NonScrollListView,而不是的顶部ScrollView。(用户必须向上滚动到。ScrollView之前的内容NonScrollListView。)对于EXACTLYAT_MOST测量模式,以及传递给makeMeasureSpec()
kdbanman的

4
@Dedaniyahirenkumar,但是,如果将测量模式切换为UNSPECIFIED,则父级将ScrollView保持滚动Y =零(预期行为)。显然,NonScrollListView在这种情况下,不会显示其全部内容。
kdbanman

1
那就是我想要的,非常感谢您。Dedaniya Hiren先生,它的运作就像是一种魅力:)
Kishan Soni

10

根本不需要使用listview

如果您确实考虑过,listview可以将a替换为LinearLayout您的情况。该Adapter会是相同的,但是的,而不是与你的连接适配器listview,只需调用getView适配器的功能在for循环中的数据,并添加检索到的意见,您的垂直linearlayout

但是,仅当列表中的项目较少并且这些项目的显示形式不占用大量内存时,才建议使用此方法。


我使用线性布局而不是列表视图,它可以工作,但是看不到没有空间的项目!我在父级中使用线性布局
侯赛因

LinearLayout并不是ListView要使用背后的优点的合理替代品AbsListView.CHOICE_MODE_MULTIPLE_MODAL-为避免重新发明轮子,请参阅NonScrollListView解决方案
rymo 2014年

我认为用LinearLayout替换ListView似乎是逻辑,但是您也失去了ListView固有的回收能力。尝试使用LinearLayout并通过扩大其中的许多视图来动态地对其进行充电。垃圾收集器会发疯
Joaquin Iurchuk 2015年

2

最好的方法(在2017年)是将RecyclerView搭配使用NestedScrollView

无需黑客,它可以像您想要的那样开箱即用。


1
虽然这是一个不错的解决方案,但我认为这不是OP想要的The problem is that I don't want the ListViews to be scrollable
Dan

0

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

如果你不想使用它(对于可能许可证的原因),你可以有一个单一的ListView那里(而不是那些连续2列表视图)和覆盖getItemViewsCountgetItemViewType以及getView为了给上述布局。如果您android listview different rows在Google上搜索,则会找到有用的信息。例如,此链接链接

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


谢谢。问题是我希望ImageView和TextView可滚动-如果我向下滚动,它们会上升,并且ListView中的项目会出现。
丹尼斯

然后使用合并适配器,并在其中添加ImageView和TextView。即使有多个listtypes您可以通过设置视图类型的ImageView和TextView的为1和2的类型,剩下的你可以有3和4。做同样的事情
Gúnár酒店

0

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

在此处输入图片说明

假设您需要设计此视图...现在,父布局大小是通过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);
}

就这样 :)


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);

希望对你有用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.