当键盘打开时,Recyclerview不会滚动结束

时间:2015-12-05 08:11:31

标签: android listview android-recyclerview android-softkeyboard

我在我的应用程序中使用recylerview,每当将新元素添加到recyclerview时,它就会使用

滚动到最后一个元素
recyclerView.scrollToPosition(adapter.getCount());

但是,每当键盘打开时(因为editTextView),它会调整视图大小并使recyclerview变小,但无法滚动到最后一个元素。

android:windowSoftInputMode="adjustResize"

我甚至尝试使用以下代码滚动到最后一个元素,但它不起作用

editTextView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus){
                recyclerView.scrollToPosition(chatAdapter.getItemCount());
            }
        }
    });

我可以尝试adjustPan向上移动平移,但它隐藏了我的工具栏。 请提出任何解决问题的方法。

10 个答案:

答案 0 :(得分:57)

您可以使用recyclerview.addOnLayoutChangeListener()捕捉键盘更改。 如果bottom小于oldBottom,则键盘处于up状态。

if ( bottom < oldBottom) { 
   recyclerview.postDelayed(new Runnable() { 
       @Override 
       public void run() {
           recyclerview.scrollToPosition(bottomPosition); 
       }
    }, 100);
}

答案 1 :(得分:46)

添加您的活动或片段:

    if (Build.VERSION.SDK_INT >= 11) {
        recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v,
                    int left, int top, int right, int bottom,
                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (bottom < oldBottom) {
                    recyclerView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            recyclerView.smoothScrollToPosition(
                                    recyclerView.getAdapter().getItemCount() - 1);
                        }
                    }, 100);
                }
            }
        });
    }

答案 2 :(得分:17)

它对我有用

LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);

答案 3 :(得分:7)

虽然这是一个老问题,但我今天遇到了这个问题,并且我发现上述方法都不起作用。这是我的解决方案

DataSnapshot

答案 4 :(得分:4)

我发现postDelayed是不必要的,并且使用适配器位置不会考虑回收器何时滚动到项目中间的某个位置。我实现了我想要的外观:

recycler.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
    if (bottom < oldBottom) {
        messageRecycler.scrollBy(0, oldBottom - bottom);
    }
})

答案 5 :(得分:3)

这很有效。

where to_char(start_time) > '01/01/2016'

答案 6 :(得分:2)

        var response = this.responseText;
        try {
            console.log("success");
            var response = JSON.parse(response);
            if (callback)
                callback(response);
        }
        catch(e){
            console.log("error parsing");
            if (callback)
                callback("error");
        }

答案 7 :(得分:1)

它在支持库版本27.0.1中正常工作

清单中没有任何内容可以设置。

 strtoul(argv, NULL, 0); //useless call, you need to store the result
 pid= fork(); 

答案 8 :(得分:0)

NestedScrollView

中绑定 RecyclerView
<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</android.support.v4.widget.NestedScrollView>

答案 9 :(得分:0)

layoutManager.scrollToPositionWithOffset(chatMessageAdapter.getItemCount() - 1,0);