为什么在视图聚焦时,RecyclerView会滚动到视图顶部

时间:2017-08-02 10:19:09

标签: android scroll android-recyclerview keyboard

我有RecyclerView,某种聊天。项目为TextViews布局相反。 RecyclerView下面的输入字段。当我滚动到RecyclerView的底部并点击底部项目时它会聚焦(只有当它聚焦时,而不是每次点击时),RecyclerView自动滚动到该项目的顶部(当文本时) in item大于屏幕高度。)

当键盘可见并且我点击RecyclerView项目 - 键盘隐藏和回收者视图滚动到该项目的顶部时,如何禁用此类行为?

我希望它在键盘打开时或在我点击某个项目时保持在同一位置。

键盘隐藏了此方法

* * * * 
inputView.setOnFocusChangeListener((v, hasFocus) -> {
        if (!hasFocus){
            hideKeyboard();
        } 
    });
* * * * 

public void hideKeyboard() {
    InputMethodManager keyboard = (InputMethodManager)

    getSystemService(Context.INPUT_METHOD_SERVICE);
    keyboard.hideSoftInputFromWindow(inputView.getWindowToken(), 0);
}

RecyclerView以这种方式配置:

    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.messageList);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    linearLayoutManager.setReverseLayout(true);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(chatAdapter = new chatAdapter(getContext()));

如果我按下按钮并通过单击该按钮调用hideKeyBoard() - 它可以,它不会滚动,但是当我点击RecyclerView项目时 - 它会聚焦并滚动到该项目的顶部

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,我扩展了LinearLayoutManager并覆盖了一些方法。现在它不会滚动到焦点项目。也许有人知道更好的解决方案?

public class NotScrollingToFocuesChildrenLinearLayoutManager extends LinearLayoutManager {
public NotScrollingToFocuesChildrenLinearLayoutManager(Context context) {
    super(context);
}

public NotScrollingToFocuesChildrenLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
}

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

@Override
public boolean onRequestChildFocus(RecyclerView parent, RecyclerView.State state, View child, View focused) {
    //return super.onRequestChildFocus(parent, state, child, focused);
    return true;
}

@Override
public boolean onRequestChildFocus(RecyclerView parent, View child, View focused) {
    //return super.onRequestChildFocus(parent, child, focused);
    return true;
}
}

答案 1 :(得分:0)

这个答案可能也是您的解决方案:RecyclerView scrolls to top after keyboard hides

<activity
    android:windowSoftInputMode="adjustPan"

Android Developer Site link

  

“adjustResize”

     

活动的主窗口始终调整大小以便为软件腾出空间   键盘在屏幕上。

     

“adjustPan”

     

活动的主窗口未调整大小以便为软件腾出空间   键盘。相反,窗口的内容会自动平移   这样当前的焦点永远不会被键盘和用户遮挡   总能看到他们正在打字的东西。这通常不太理想   比调整大小,因为用户可能需要关闭软键盘   进入并与窗户的模糊部分互动。