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.
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);
}
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);
}
}
});
}
Für mich geht das
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
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);
}
});
}
});
}
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());
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);
}
});
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());
}
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
}
}
layoutManager.scrollToPositionWithOffset (chatMessageAdapter.getItemCount () - 1, 0);
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>