如何以编程方式在键盘上滚动一个recyclerview?

时间:2018-11-19 11:28:06

标签: android android-layout android-recyclerview recycler-adapter recyclerview-layout

我有一个recyclerview,其中有一个编辑文本,该文本将隐藏并在单击某些按钮时打开。 请参阅screen 1

单击拒绝或接受时,将显示视图:

on click of reject or accept the view is displayed

现在,我的recyclerview正在向下扩展,但我希望它像这样向上扩展:

默认情况下,它会向下扩展:

by default, it expands downward

我希望它像这样向上扩展:

I want it to expand upward like this

类似地,当键盘打开时,我希望整个recyclerview像这样位于键盘上方。

默认情况下,它不会向上移动:

by default, it does not move upward

我想要这样的东西:

I want something like this

该功能应采用什么方法?
我需要计算单元格高度,键盘高度还是其他方法?

请附上相关链接。
谢谢

2 个答案:

答案 0 :(得分:1)

我是为我的聊天类编写的,您可以根据自己的需要重写此代码段。

private boolean keyboardShown(View rootView) {

    final int softKeyboardHeight = 100;
    Rect r = new Rect();
    rootView.getWindowVisibleDisplayFrame(r);
    DisplayMetrics dm = rootView.getResources().getDisplayMetrics();
    int heightDiff = rootView.getBottom() - r.bottom;
    return heightDiff > softKeyboardHeight * dm.density;
}

messageEditText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (keyboardShown(messageEditText.getRootView())) {
                Log.d("keyboard", "keyboard UP");

                if (keyboardUp == false) {
                    if (results.size() > 0)
                        chatList.smoothScrollToPosition(results.size()+1);
                    keyboardUp = true;
                }

            } else {
                Log.d("keyboard", "keyboard Down");
                keyboardUp = false;
            }
        }
    });

答案 1 :(得分:0)

让我们将问题分为两部分,向下滚动RecyclerView并在显示键盘时显示单元格。

  1. 只需将scrollToPosition(index)与单元格索引一起使用

  2. 您只需在活动中将android:windowSoftInputMode更改为AdjustSize:

    <activity
    android:windowSoftInputMode="adjustResize"
    android:name=".MainActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    

或仅在片段中:

        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)