为了账号安全,请及时绑定邮箱和手机立即绑定

列表视图在ScrollView中没有在Android上滚动

列表视图在ScrollView中没有在Android上滚动

潇潇雨雨 2019-05-31 16:30:29
列表视图在ScrollView中没有在Android上滚动我的卷轴有问题ListView在一个ScrollView..我有一个在顶部有一些Edittext的活动,然后是一个有两个选项卡的选项卡主机,每个选项卡都有一个ListView。当EditText视图被聚焦时,软键盘出现,当我有一个ScrollView时,内容是可滚动的。但是,当ListViews中有更多的条目(选项卡中的条目)时,我就无法滚动ListView,即使有更多的条目,也会出现问题。以下是布局XML:<?xml version="1.0" encoding="utf-8"?><RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:background="?backgroundImage"     android:orientation="vertical">   <LinearLayout         android:orientation="horizontal"         android:layout_width="fill_parent"         android:layout_height="50dip"         android:layout_alignParentBottom="true"         android:layout_margin="10dip"         android:id="@+id/buttons">     <Button             android:text="Save"             android:layout_margin="2dip"             android:textSize="20dip"             android:id="@+id/btnSaveorUpdate"             android:layout_height="wrap_content"             android:layout_width="145dip"></Button>     <Button             android:text="Cancel"             android:layout_margin="2dip"             android:textSize="20dip"             android:id="@+id/btnCancelorDelete"             android:layout_height="wrap_content"             android:layout_width="145dip"></Button>   </LinearLayout>   <ScrollView         android:layout_above="@id/buttons"         android:layout_width="fill_parent"         android:layout_height="fill_parent"         android:fillViewport="true"         android:layout_margin="10dip">     <LinearLayout             android:orientation="vertical"             android:layout_width="fill_parent"             android:layout_height="fill_parent"             android:layout_margin="10dip">谁能告诉我这里有什么问题吗?我还有一篇关于ListView内部ScrollView问题的文章,但它们在我的例子中没有用。
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

你不应该把ListView在一个ScrollView因为ListView类实现自己的滚动,只是不接收手势,因为它们都是由父类处理的。ScrollView..我强烈建议你以某种方式简化你的布局。例如,可以将希望滚动的视图添加到ListView作为标题或页脚。

更新:

从API 21级(Lolliop)开始,Android SDK正式支持嵌套滚动容器。有很多方法ViewViewGroup提供此功能的类。要使嵌套滚动在Lolliop上工作,必须为子滚动视图启用它,方法是添加android:nestedScrollingEnabled="true"到它的xml声明或显式调用setNestedScrollingEnabled(true).

如果您想在预Lolliop设备上进行嵌套滚动操作(您可能会这样做),则必须使用支持库中的相应实用程序类。首先你必须替换你ScrollView带着NestedScrollView..后者实现了两个NestedScrollingParentNestedScrollingchild因此,它可以用作父或子滚动容器。

ListView不支持嵌套滚动,因此需要将其子类并实现NestedScrollingChild..幸运的是,支持库提供了NestedScrollingChild Helper类,因此您只需创建该类的实例并从视图类的相应方法调用其方法即可。


查看完整回答
反对 回复 2019-05-31
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我找到了一个很好的解决方案,可以滚动ListView没有问题:

ListView lv = (ListView)findViewById(R.id.myListView);  // your listview inside scrollviewlv.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;
        }
    });

这样做是禁用TouchEventS在.ScrollView并使.ListView拦截他们。它很简单,而且一直在工作。


查看完整回答
反对 回复 2019-05-31
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我也有一个解决办法。我总是用这种方法。尝尝这个

<ScrollView
    android:id="@+id/createdrill_scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="15dp" >

            <net.thepaksoft.fdtrainer.NestedListView
                android:id="@+id/crewList"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_marginBottom="2dp"
                android:layout_weight="1"
                android:background="@drawable/round_shape"
                android:cacheColorHint="#00000000" >
            </net.thepaksoft.fdtrainer.NestedListView>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="15dp" >

            <net.thepaksoft.fdtrainer.NestedListView
                android:id="@+id/benchmarksList"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_marginBottom="2dp"
                android:layout_weight="1"
                android:background="@drawable/round_shape"
                android:cacheColorHint="#00000000" >
            </net.thepaksoft.fdtrainer.NestedListView>
        </LinearLayout></ScrollView>

java类:

public class NestedListView extends ListView implements OnTouchListener, OnScrollListener {

    private int listViewTouchAction;
    private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;

    public NestedListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        listViewTouchAction = -1;
        setOnScrollListener(this);
        setOnTouchListener(this);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                scrollBy(0, -1);
            }
        }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int newHeight = 0;
        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (heightMode != MeasureSpec.EXACTLY) {
            ListAdapter listAdapter = getAdapter();
            if (listAdapter != null && !listAdapter.isEmpty()) {
                int listPosition = 0;
                for (listPosition = 0; listPosition < listAdapter.getCount()
                        && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) {
                    View listItem = listAdapter.getView(listPosition, null, this);
                    //now it will not throw a NPE if listItem is a ViewGroup instance
                    if (listItem instanceof ViewGroup) {
                        listItem.setLayoutParams(new LayoutParams(
                                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                    }
                    listItem.measure(widthMeasureSpec, heightMeasureSpec);
                    newHeight += listItem.getMeasuredHeight();
                }
                newHeight += getDividerHeight() * listPosition;
            }
            if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) {
                if (newHeight > heightSize) {
                    newHeight = heightSize;
                }
            }
        } else {
            newHeight = getMeasuredHeight();
        }
        setMeasuredDimension(getMeasuredWidth(), newHeight);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) {
            if (listViewTouchAction == MotionEvent.ACTION_MOVE) {
                scrollBy(0, 1);
            }
        }
        return false;
    }}


查看完整回答
反对 回复 2019-05-31
  • 3 回答
  • 0 关注
  • 676 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信