Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ScrollView doesn't start at top, but at the beginning of the GridView

I have a problem with a ScrollView that has inside of it a personalized GridView and other tipe of views.The first time I start the Activity, the ScrollView starts at its top, but if I visit the Activity other times the ScrollView starts at the beginning of the GridView.I used the class ExpandableHeightGridView found in this link for my GridView. The xml code for the Activity layout is this one:

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

I've tried using the code scrollView.fullScroll(ScrollView.FOCUS_UP); but it didn't work.And even with scrollView.scrollTo(0, 0); I didn't have success. The only code that worked was:

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

but it makes a fast animation from the top of the GridView to the top of the screen and i don't like it.

Any suggestion??

like image 208
user2328149 Avatar asked Jun 02 '13 18:06

user2328149


2 Answers

Solution:

Ok sorry if it is a late reply but I stumbled upon the same issue (only that I was using ListView instead) and with a bit of trial and error I found the solution to this:

Basically the problem lies in the fact that the GridView/ListView child automatically requests parent focus (ScrollView) when you "hack" and resize its content with ExpandableHeightGridView, which happens after layout is rendered, and hence you see that animation when trying to scroll it up with scrollTo() (happens AFTER layout is created and AFTER gridView is resized so any generic callback is useless to handle this programatically).

So then, the simplest solution I found was to simply disable focusable property on the ListView/GridView with:

listView.setFocusable(false); 

That way when you first enter the activity, focus will default and not rely on Listview/GridView.

And all working fine =)

like image 121
SuppressWarnings Avatar answered Oct 08 '22 14:10

SuppressWarnings


The easiest way is to add on the parent ScrollView the following xml attributes:

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

That means that the ScrollView as a whole will be the one getting focus instead of any inner container when you launch the activity. This is also useful, for example, when you have an edit text inside your layout and you don't want it to get focus immediately and popup the keyboard when entering a screen (It's the same principle).

So, your ScrollView on top of your layout would look like this:

<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" > 
like image 39
Disruption Avatar answered Oct 08 '22 14:10

Disruption