This is sort of a strange bug I discovered.
But if I have a RecyclerView in a fragment and I open then close my DrawerLayout, my RecyclerView comes in focus. That means closing my DrawerLayout will cause the ScrollView to jump to my RecyclerView. Obviously, I would like the ScrollView's position to not move when the DrawerLayout is closed, and definitely not settle on my RecyclerView.
CODE
Throughout my application, I have RecyclerViews contained within ScrollViews, similar to this setup:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="180dp">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/header_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:tint="#80000000"
android:scaleType="centerCrop"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true">
<TextView android:id="@+id/header_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:textColor="@color/text_SecondaryColor"
android:textSize="@dimen/header_xxlarge"/>
<View android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="@dimen/hr_thick"
android:background="@color/accent_PrimaryColor"/>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_margin="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/button_more"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:layout_width="400px"
android:layout_height="100px"
android:layout_gravity="center"
android:gravity="center"
android:background="@drawable/button_dark"
android:textColor="@drawable/button_dark_textcolor"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
And my DrawerLayout's XML design is arranged like this:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:layout_height="wrap_content"
android:layout_width="match_parent"
layout="@layout/toolbar" />
</LinearLayout>
<FrameLayout
android:id="@+id/contentframe"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/background_Secondary">
<!-- Relative Layout : Back Button -->
<RelativeLayout
android:id="@+id/menu_backcontainer"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<ImageView
android:id="@+id/menu_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:src="@drawable/angle"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<!-- List View : Menu Drawer Content -->
<ListView
android:id="@+id/menu"
android:layout_below="@id/menu_backcontainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:background="@color/background_PrimaryDarkColor">
</ListView>
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
I am not sure what other Java Code I need to include here but this is how I instantiate my RecyclerView:
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext().getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
And For My DrawerLayout:
drawerlayout = (DrawerLayout)findViewById(R.id.drawer);
menu = (ListView)findViewById(R.id.menu);
MenuAdapter adapter = new MenuAdapter(
this,
R.layout.listview_menuitem,
menuItemArray);
menu.setAdapter(adapter);
menu.setOnItemClickListener(new menuItemClickListener());
menuToggle = new ActionBarDrawerToggle(
this,
drawerlayout,
toolbar,
R.string.app_name,
R.string.app_name);
drawerlayout.setDrawerListener(menuToggle);
menuToggle.syncState();
Gee, it is amazing what a moment away from the computer and a cup of coffee will do.
I simply set the focusableInTouchMode
attribute of my FrameLayout to true
.
I guess this nullifies the RecyclerViews desire to be the focused element in the ScrollView when I touch anywhere on the screen after the DrawerLayout is opened. Perhaps there is a better, more thorough explanation. But I hope this helps anyone else who may experience this problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With