wake-up-neo.net

Recyclerview scrollt nicht, um zu enden, wenn die Tastatur geöffnet wird

Ich verwende Recylerview in meiner Anwendung. Wenn ein neues Element zum Recyclerview hinzugefügt wird, wird es mit dem letzten Element durchgeblättert

recyclerView.scrollToPosition(adapter.getCount());

Wenn sich jedoch die Tastatur öffnet (aufgrund von editTextView), wird die Ansicht in der Größe geändert und die Übersicht wird kleiner, es konnte jedoch nicht bis zum letzten Element geblättert werden.

Android:windowSoftInputMode="adjustResize"

Ich habe sogar versucht, den folgenden Code zu verwenden, um zum letzten Element zu scrollen, aber es hat nicht funktioniert

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

Ich kann adjustPan versuchen, um das Fenster nach oben zu verschieben, aber es verdeckt meine Symbolleiste. Bitte schlagen Sie eine Möglichkeit vor, das Problem zu beheben.

42
Mukesh Sharma

Mit recyclerview.addOnLayoutChangeListener() können Sie Änderungen an der Tastatur einholen. Ist bottom kleiner als oldBottom, ist die Tastatur aktiv 

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

Fügen Sie dies Ihre Aktivität oder Ihr Fragment hinzu:

    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);
                }
            }
        });
    }
41
mutkan

Für mich geht das

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

Obwohl dies eine alte Frage ist, habe ich dieses Problem heute erfahren und habe herausgefunden, dass keine der oben genannten Methoden funktioniert. Das ist meine Lösung

    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) {
                final int lastAdapterItem = mAdapter.getItemCount() - 1;
                recyclerView.post(new Runnable() {
                  @Override
                  public void run() {
                    int recyclerViewPositionOffset = -1000000;
                    View bottomView = linearLayoutManager.findViewByPosition(lastAdapterItem);
                    if (bottomView != null) {
                       recyclerViewPositionOffset = 0 - bottomView.getHeight();
                     }
                     linearLayoutManager.scrollToPositionWithOffset(lastAdapterItem, recyclerViewPositionOffset);
                  }
                });
              }
         });
   }
7
Kutae Shaw
        recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());
3
sdelvalle57

Ich habe festgestellt, dass PostDelayed nicht notwendig ist, und die Verwendung von Adapterpositionen berücksichtigt nicht, wenn der Recycler irgendwo in der Mitte eines Artikels angezeigt wird. Damit habe ich den gewünschten Look erzielt.

recycler.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, xoldRight, oldBottom) -> {
    if (bottom < oldBottom) {
        messageRecycler.scrollBy(0, oldBottom - bottom);
    }
});
3
mp501

Das funktioniert.

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private LinearLayoutManager mManager;

...

mManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mManager);

(initialize and set adapter.)

mRecyclerView.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) scrollToBottom();
    }
});

private void scrollToBottom() {
    mManager.smoothScrollToPosition(mRecyclerView, null, mAdapter.getItemCount());
}
3
wonsuc

Es funktioniert ordnungsgemäß in der Support Library Version 27.0.1

Im Manifest ist nichts zu setzen.

val currentScrollPosition = 0

recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)

            currentScrollPosition = recyclerView.computeVerticalScrollOffset() + recyclerView.computeVerticalScrollExtent()
        }

        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { }
    })

    storyList.addOnLayoutChangeListener { view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
        if (bottom < oldBottom) {
            if (currentScrollPosition >= recyclerView.computeVerticalScrollRange()) {
                recyclerVIew.post {
                    recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_NEVER
                    recyclerView.smoothScrollBy(0, recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() + recyclerView.computeVerticalScrollExtent())
                }
            }
        } else {
            recyclerView.overScrollMode = RecyclerView.OVER_SCROLL_ALWAYS
        }
    }
1
minjung Ahn

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

0
Ramesh R

Binden Sie die RecyclerView inside NestedScrollView

<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>
0
Karthikeyan