windowSoftInputMode=“adjustResize” not working with translucent action/navbar


windowSoftInputMode=“adjustResize” not working with translucent action/navbar



I have problems with the translucent actionbar/navbar in the new Android KitKat (4.4) and the windowSoftInputMode="adjustResize".


windowSoftInputMode="adjustResize"



Normaly changing the InputMode to adjustResize, the app should resize itself when keyboard is shown... but here it won't! If I delete the lines for the transparent effect, the resize is working.



So if the keyboard is visible, my ListView is under it and I can't access the last few items. (Only by hiding the keyboard manually)



AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >

<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>



values-v19/styles.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>

</resources>



fragment.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>

</RelativeLayout>



Anyone ideas for fixing this?





possible duplicate of android:windowSoftInputMode="adjustResize" doesn't make any difference?
– mikepenz
May 4 '15 at 22:06




13 Answers
13



You are missing the following property:


android:fitsSystemWindows="true"



in the root RelativeLayout of the fragment .xml layout.


RelativeLayout



Update:



Last year there was an interesting talk by Chris Bane that explains in good detail how this works:



https://www.youtube.com/watch?v=_mGDMVRO3iE





I guess it`s something with full screen policy
– Felix.D
Feb 11 '15 at 9:41





You are the man! I this issue happened to me only on Lollipop version, and it fix it.
– David
Feb 18 '15 at 11:47





This seems necessary only with API 19+. Previous versions and using a RelativeLayout the adjustResize seems enough.
– Davidea
May 10 '15 at 8:04






@David It's nt fixed yet, still breaking in marshmallow device , if you open a dialog and try to scroll then softkeboard will block the scrolling
– Bytecode
May 5 '16 at 6:22





It works, but conflict with my toolbar and statusbar customization
– Ninja
Oct 31 '17 at 8:50



There's a related bug report here. I've found a workaround that, from limited testing, seems to do the trick with no repercussions. Add a custom implementation of your root ViewGroup (I almost always am using FrameLayout, so this is what I've tested with) with the logic below. Then, use this custom layout in place of your root layout, and ensure you set android:fitsSystemWindows="true". You can then just call getInsets() any time after layout (e.g. add an OnPreDrawListener) to adjust the rest of your layout to account for the system insets, if desired.


ViewGroup


FrameLayout


android:fitsSystemWindows="true"


getInsets()


OnPreDrawListener


import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import org.jetbrains.annotations.NotNull;

/**
* @author Kevin
* Date Created: 3/7/14
*
* https://code.google.com/p/android/issues/detail?id=63777
*
* When using a translucent status bar on API 19+, the window will not
* resize to make room for input methods (i.e.
* {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE} and
* {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_PAN} are
* ignored).
*
* To work around this; override {@link #fitSystemWindows(android.graphics.Rect)},
* capture and override the system insets, and then call through to FrameLayout's
* implementation.
*
* For reasons yet unknown, modifying the bottom inset causes this workaround to
* fail. Modifying the top, left, and right insets works as expected.
*/
public final class CustomInsetsFrameLayout extends FrameLayout {
private int mInsets = new int[4];

public CustomInsetsFrameLayout(Context context) {
super(context);
}

public CustomInsetsFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public final int getInsets() {
return mInsets;
}

@Override
protected final boolean fitSystemWindows(@NotNull Rect insets) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// Intentionally do not modify the bottom inset. For some reason,
// if the bottom inset is modified, window resizing stops working.
// TODO: Figure out why.

mInsets[0] = insets.left;
mInsets[1] = insets.top;
mInsets[2] = insets.right;

insets.left = 0;
insets.top = 0;
insets.right = 0;
}

return super.fitSystemWindows(insets);
}
}



Since fitSystemWindows was deprecated, please refer to the answer below to complete the workaround.


fitSystemWindow





Actually SOFT_INPUT_ADJUST_PAN seems to be NOT ignored according to my experience - it will move whole screen up, including system bar and shift keyboard under focused view.
– sealskej
Oct 23 '14 at 10:59





Thanks - you are correct about the SOFT_INPUT_ADJUST_PAN. I used this in my fragment: getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
– Simon
Aug 14 '15 at 19:32





That was the only way I could achieve having adjustResize for activity (needed for the scrolling of the view upon showing keyboard), fitSystemWindows set as true so that the scroll actually happens on >= Lollipop and having translucent statusBar. Thanks a lot.
– Lucas
Jun 2 '16 at 15:40





this is the actual solution
– martyglaubitz
Aug 29 '16 at 9:22



@kcoppock answer is really helpful, but fitSystemWindows was deprecated in API level 20



So since API 20 (KITKAT_WATCH) you should override onApplyWindowInsets


@Override
public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
insets.getSystemWindowInsetBottom()));
} else {
return insets;
}
}





In what class should we override this?
– Ben-J
Nov 14 '16 at 16:12





@Ben-J in a class which extends original class
– Victor91
Nov 14 '16 at 22:39





I have no idea why you set mInsets array elements while it's not used, but it works
– Buckstabue
May 26 '17 at 0:08



This worked for me to have translucent status bar and adjustResize in fragment:



Make a custom RelativeLayout as @Victor91 and @kcoppock said.



Use CustomRelativeLayout as parent layout for your fragment.



Declare theme with android:windowTranslucentStatus = true



The container Activity must be declared in Manifest with
android:windowSoftInputMode="adjustResize" and use the declared
theme



Please Use fitsSystemWindows on fragment root layout!


public class CustomRelativeLayout extends RelativeLayout {

private int mInsets = new int[4];

public CustomRelativeLayout(Context context) {
super(context);
}

public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
mInsets[0] = insets.getSystemWindowInsetLeft();
mInsets[1] = insets.getSystemWindowInsetTop();
mInsets[2] = insets.getSystemWindowInsetRight();
return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
insets.getSystemWindowInsetBottom()));
} else {
return insets;
}
}
}



Then in xml,


<com.blah.blah.CustomRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
</com.blah.blah.CustomRelativeLayout>





This is the best answer so far, and I'm looking for solution some time now. It's working perfectly, but you have to add some extra padding to your toolbar, without it your toolbar will be overlapping statusbar
– Paulina
Jul 3 at 15:10



I had the same problem,
My Activity had a ScrollView as root view and with translucent statusbar activated it didn't resize correctly when keyboard showed... and conseguently the screen didn't scrolled hiding the input views.



Solution:
Moved everything (layout and activity logic) inside a new Fragment.
Then changed the Activity to only include this Fragment. Now everything works as expected!



This is the layout of the activity:


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/contentView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" />





Does not work for me
– Alex
Jun 3 '16 at 19:43





Works like a charm for me
– Mihael Isaev
Apr 14 '17 at 17:00



Based on Joseph Johnson's workaround in Android How to adjust layout in Full Screen Mode when softkeyboard is visible



call this in onCreate() after setContentView() in your activity.


onCreate()


setContentView()



AndroidBug5497Workaround.assistActivity(this);


AndroidBug5497Workaround.assistActivity(this);



a litte different from original replace return (r.bottom - r.top); with return r.bottom; in computeUsableHeight()


return (r.bottom - r.top);


return r.bottom;


computeUsableHeight()



for some reason, i must set my activity fitsSystemWindows attribute to false.


fitsSystemWindows


false



this workaround saved me. it's works well for me. hope can help you.



the implementation class is:


public class AndroidBug5497Workaround {

// For more information, see https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

public static void assistActivity (Activity activity) {
new AndroidBug5497Workaround(activity);
}

private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;

private AndroidBug5497Workaround(Activity activity) {
FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
possiblyResizeChildOfContent();
}
});
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious) {
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard/4)) {
// keyboard probably just became visible
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
} else {
// keyboard probably just became hidden
frameLayoutParams.height = usableHeightSansKeyboard;
}
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}

private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);
return r.bottom;
}

}



If you want to customize the insets and you are targeting API level >=21 you can accomplish this without having to create a custom view group. By just setting fitsSystemWindows padding will be applied to your container view by default, which you may not want.


fitsSystemWindows



The version checks are built into this method and only devices >= 21 will execute the code inside the lambda. Kotlin example:


ViewCompat.setOnApplyWindowInsetsListener(container) { view, insets ->
insets.replaceSystemWindowInsets(0, 0, 0, insets.systemWindowInsetBottom).apply {
ViewCompat.onApplyWindowInsets(view, this)
}
}



Make sure your layout still sets the fitsSystemWindows flag otherwise the window insets listener will not be called.


fitsSystemWindows


<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
/>



These sources are helpful:



https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
https://medium.com/@azizbekian/windowinsets-24e241d4afb9



AndroidBug5497Workaround.java take care memory leak. need below code


getViewTreeObserver().removeOnGlobalLayoutListener(listener);



My sample using RxJava that automatically call removeOnGlobalLayoutListener() when onPause() in Activity's lifecycle


public class MyActivity extends RxAppCompatActivity {
// ...

protected void onStart(){
super.onStart();

TRSoftKeyboardVisibility
.changes(this) // activity
.compose(this.<TRSoftKeyboardVisibility.ChangeEvent>bindUntilEvent(ActivityEvent.PAUSE))
.subscribe(keyboardEvent -> {
FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
View firstChildView = content.getChildAt(0);
firstChildView.getLayoutParams().height = keyboardEvent.viewHeight();
firstChildView.requestLayout();

// keyboardEvent.isVisible = keyboard visible or not
// keyboardEvent.keyboardHeight = keyboard height
// keyboardEvent.viewHeight = fullWindowHeight - keyboardHeight
});
//...
}





package commonlib.rxjava.keyboard;

import android.app.Activity;
import android.view.View;
import android.widget.FrameLayout;
import kr.ohlab.android.util.Assert;
import rx.Observable;

public class TRSoftKeyboardVisibility {

public static Observable<ChangeEvent> changes(Activity activity) {
Assert.notNull(activity, "activity == null");
FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
View childOfContent = content.getChildAt(0);
return Observable.create(
new TRSoftKeyboardVisibilityEventOnSubscribe(childOfContent));
}

public static final class ChangeEvent {
private final int keyboardHeight;
private final boolean visible;
private final int viewHeight;

public static ChangeEvent create(boolean visible, int keyboardHeight,
int windowDisplayHeight) {
return new ChangeEvent(visible, keyboardHeight, windowDisplayHeight);
}

private ChangeEvent(boolean visible, int keyboardHeight, int viewHeight) {
this.keyboardHeight = keyboardHeight;
this.visible = visible;
this.viewHeight = viewHeight;
}

public int keyboardHeight() {
return keyboardHeight;
}

public boolean isVisible() {
return this.visible;
}

public int viewHeight() {
return viewHeight;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ChangeEvent)) return false;

ChangeEvent that = (ChangeEvent) o;

if (keyboardHeight != that.keyboardHeight) return false;
if (visible != that.visible) return false;
return viewHeight == that.viewHeight;
}

@Override
public int hashCode() {
int result = keyboardHeight;
result = 31 * result + (visible ? 1 : 0);
result = 31 * result + viewHeight;
return result;
}

@Override
public String toString() {
return "ChangeEvent{" +
"keyboardHeight=" + keyboardHeight +
", visible=" + visible +
", viewHeight=" + viewHeight +
'}';
}
}
}


package commonlib.rxjava.keyboard;

import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import kr.ohlab.android.util.Assert;
import rx.Observable;
import rx.Subscriber;
import rx.android.MainThreadSubscription;
import timber.log.Timber;

public class TRSoftKeyboardVisibilityEventOnSubscribe
implements Observable.OnSubscribe<TRSoftKeyboardVisibility.ChangeEvent> {
private final View mTopView;
private int mLastVisibleDecorViewHeight;
private final Rect mWindowVisibleDisplayFrame = new Rect();

public TRSoftKeyboardVisibilityEventOnSubscribe(View topView) {
mTopView = topView;
}

private int computeWindowFrameHeight() {
mTopView.getWindowVisibleDisplayFrame(mWindowVisibleDisplayFrame);
return (mWindowVisibleDisplayFrame.bottom - mWindowVisibleDisplayFrame.top);
}

private TRSoftKeyboardVisibility.ChangeEvent checkKeyboardVisibility() {
int windowFrameHeightNow = computeWindowFrameHeight();
TRSoftKeyboardVisibility.ChangeEvent event = null;
if (windowFrameHeightNow != mLastVisibleDecorViewHeight) {
int mTopViewHeight = mTopView.getHeight();
int heightDiff = mTopViewHeight - windowFrameHeightNow;
Timber.e("XXX heightDiff=" + heightDiff);
if (heightDiff > (mTopViewHeight / 4)) {
event = TRSoftKeyboardVisibility.ChangeEvent.create(true, heightDiff, windowFrameHeightNow);
} else {
event = TRSoftKeyboardVisibility.ChangeEvent.create(false, 0, windowFrameHeightNow);
}
mLastVisibleDecorViewHeight = windowFrameHeightNow;
return event;
}

return null;
}

public void call(final Subscriber<? super TRSoftKeyboardVisibility.ChangeEvent> subscriber) {
Assert.checkUiThread();

final ViewTreeObserver.OnGlobalLayoutListener listener =
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
TRSoftKeyboardVisibility.ChangeEvent event = checkKeyboardVisibility();
if( event == null)
return;
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(event);
}
}
};

mTopView.getViewTreeObserver().addOnGlobalLayoutListener(listener);

subscriber.add(new MainThreadSubscription() {
@Override
protected void onUnsubscribe() {
mTopView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
});
}
}



I had like a problem.



I set windowDrawsSystemBarBackgrounds to 'true' and my app should show under status bar.



It's my activity theme.


<item name="android:windowTranslucentStatus" tools:targetApi="KITKAT">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>



and I got help from jianshu's blog.
you can read code but text like me.
I add few code more.


public final class ZeroInsetsFrameLayout extends FrameLayout {
private int mInsets = new int[4];

public ZeroInsetsFrameLayout(Context context) {
super(context);
}

public ZeroInsetsFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ZeroInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public final int getInsets() {
return mInsets;
}

@Override
public WindowInsets computeSystemWindowInsets(WindowInsets in, Rect outLocalInsets) {
outLocalInsets.left = 0;
outLocalInsets.top = 0;
outLocalInsets.right = 0;

return super.computeSystemWindowInsets(in, outLocalInsets);
}

@Override
protected final boolean fitSystemWindows(@NonNull Rect insets) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// Intentionally do not modify the bottom inset. For some reason,
// if the bottom inset is modified, window resizing stops working.
// TODO: Figure out why.

mInsets[0] = insets.left;
mInsets[1] = insets.top;
mInsets[2] = insets.right;

insets.left = 0;
insets.top = 0;
insets.right = 0;
}

return super.fitSystemWindows(insets);
}
}



This is my fragment layout.


<com.dhna.widget.ZeroInsetsFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/white">

<!-- your xml code -->

</ZeroInsetsFrameLayout>



I want it to be helpful to you.
good luck!



The best practice allows user scroll content when the keyboard is shown.
So to add this functionality you need put your root layout inside the ScrollView and use windowSoftInputMode="adjustResize" activity method.


ScrollView


windowSoftInputMode="adjustResize"



But if you want to use this functionality with <item name="android:windowTranslucentStatus">true</item>
flag on Android 5 content won't be scrollable and will overlaps with keyboard.


<item name="android:windowTranslucentStatus">true</item>



To solve this issue check this answer



It shouldn't work with the translucent status bar; that setting forces the window into fullscreen mode which does not work with adjustResize.



You can either use adjustPan or use the fitsSystemWindows properties. I would suggest reading about the feature though, it has significant side effects:



https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec



XML


<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- Your xml -->
</RelativeLayout>



Activity


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView("Your Activity");
setAdjustScreen();

}



Created Func


protected void setAdjustScreen(){
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
/*android:windowSoftInputMode="adjustPan|adjustResize"*/
}



Finally adding some lines to your mainifest


<activity
android:name="Your Activity"
android:windowSoftInputMode="adjustPan|adjustResize"
android:screenOrientation="portrait"></activity>



I had the same problem. I have solved using coordinatorlayout



activity.main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android:layout_height="match_parent" android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">


<android.support.design.widget.AppBarLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent"
app:popupTheme="@style/AppTheme.PopupOverlay"
android:background="?attr/colorPrimary"
android:id="@+id/toolbar"/>

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_main2"/>

</android.support.design.widget.CoordinatorLayout>



content_main2.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">


<android.support.v7.widget.RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:id="@+id/post_msg_recyclerview">
</android.support.v7.widget.RecyclerView>

<EditText
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@color/colorPrimary"


/>

</android.support.constraint.ConstraintLayout>



MainActivity.java



now add this line linearLayoutManager.setStackFromEnd(true);


LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);
Adapter adapter1=new Adapter(arrayList);
recyclerView.setAdapter(adapter1);






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

How to make file upload 'Required' in Contact Form 7?

Rothschild family

amazon EC2 - How to make wp-config.php to writable?