Android ScrollView不是从顶部开始的,而是在GridView的开头开始的

2022-08-31 16:13:24

我对ScrollView有一个问题,它里面有一个个性化的GridView和其他尖端视图。第一次启动活动时,ScrollView 从其顶部开始,但是如果我访问活动的其他时间,ScrollView 将从 GridView 的开头开始。我为此链接中找到的类 ExpandableHeightGridView 用于我的 GridView。活动布局的 xml 代码是这样的:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollViewLuogo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="150dp"
            android:layout_height="100dp"
            android:layout_marginLeft="14dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:adjustViewBounds="true"
            android:maxHeight="200dp"
            android:maxWidth="200dp"
            android:scaleType="fitXY"
            android:src="@android:drawable/ic_menu_gallery" />

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/nomeTVActivityLuogo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textSize="17sp"
                android:textColor="#005788" />

            <TextView
                android:id="@+id/indirizzoTVActivityLuogo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout2"
        android:layout_marginTop="10dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageViewMappaLuogo"
            android:layout_width="wrap_content"
            android:layout_height="60dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="14dp"
            android:layout_marginRight="14dp"
            android:layout_marginTop="5dp"
            android:scaleType="fitXY"
            android:src="@drawable/sfondo_mappa" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="14dp"
            android:text="Immagini"
            android:textColor="#97d6f9" />

        <View
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:layout_marginLeft="14dp"
            android:layout_marginRight="14dp"
            android:layout_marginTop="5dp"
            android:background="#97d6f9" />

        <com.example.mappine.ExpandableHeightGridView
            android:id="@+id/gridViewLuogo"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:numColumns="3" >
        </com.example.mappine.ExpandableHeightGridView>

    </LinearLayout>

</RelativeLayout>

我尝试过使用代码,但它不起作用。即使我没有成功。唯一有效的代码是:scrollView.fullScroll(ScrollView.FOCUS_UP);scrollView.scrollTo(0, 0);

    scrollView.post(new Runnable() 
      { 
         public void run() { 
             scrollViewLuogo.fullScroll(ScrollView.FOCUS_UP); 
         } 
      });

但它从GridView的顶部到屏幕顶部制作了快速动画,我不喜欢它。

任何建议??


答案 1

溶液:

好吧,很抱歉,如果这是一个迟到的回复,但我偶然发现了同样的问题(只是我使用的是ListView),经过一些尝试和错误,我找到了这个问题的解决方案

基本上,问题在于 GridView/ListView 子级会自动请求父焦点 (ScrollView),当您使用 ExpandableHeightGridView “破解”并调整其内容的大小时,这种情况发生在布局呈现之后,因此,当您尝试使用 scrollTo() 向上滚动它时,您会看到动画(在创建布局和调整 gridView 大小之后发生,因此任何通用回调对于以编程方式处理此事件都是无用的)。

因此,我发现的最简单的解决方案是简单地禁用ListView/GridView上的可聚焦属性,方法是:

listView.setFocusable(false);

这样,当您第一次输入活动时,焦点将默认为焦点,而不依赖于 Listview/GridView。

而且一切都工作正常=)


答案 2

最简单的方法是在父 ScrollView 上添加以下 xml 属性:

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

这意味着当您启动活动时,ScrollView作为一个整体将是获得焦点而不是任何内部容器的容器。这也很有用,例如,当您的布局中有一个编辑文本并且您不希望它在进入屏幕时立即获得焦点并弹出键盘时(这是相同的原理)。

因此,布局顶部的 ScrollView 将如下所示:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollViewLuogo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    android:background="#fff" >

推荐