RecycleerView 하단으로 스크롤하는 방법ScrollToPosition이 작동하지 않습니다.
액티비티를 로드한 후 RecycleerView목록 맨 아래로 스크롤하고 싶습니다.
GENERIC_MESSAGE_LIST = (ArrayList) intent.getExtras().getParcelableArrayList(ConversationsAdapter.EXTRA_MESSAGE);
conversationView = (RecyclerView) findViewById(R.id.list_messages);
conversationView.setHasFixedSize(true);
conversationViewLayoutManager = new LinearLayoutManager(this);
conversationView.setLayoutManager(conversationViewLayoutManager);
conversationViewAdapter = new ConversationAdapter(GENERIC_MESSAGE_LIST, this);
conversationView.setAdapter(conversationViewAdapter);
conversationView.scrollTo(...)
"RecycleerView"에서 되지 않는 시킵니다.conversationView.scrollToPosition(...)
아무것도 안 하는 것 같아요
위의 코드 블록 뒤에, 나는 다음과 같이 덧붙였습니다.
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
과가없없 없없없다다 안에 .GENERIC_MESSAGE_LIST
.
" " " " " " " " " 」이 게시물에 있는 모든 사람이 나와 같은 시나리오에 직면했다고 생각합니다.scrollToPosition()
명백한 이유로 완전히 무시당했어요
내가 뭘 썼지?
recyclerView.scrollToPosition(items.size());
...무엇이 효과가 있었는가?
recyclerView.scrollToPosition(items.size() - 1);
LLM이 항목을 끝에서 레이아웃하도록 설정하거나 설정합니다.
는 '이것'이라는 이다.setStackFromEnd
요소가 표시됩니다.)
반에 whereas whereas.setReverseLayout
어댑터에 의해 추가된 요소의 순서가 변경됩니다.레이아웃은 LTR Recycker View의 왼쪽 끝에 있는 마지막 요소부터 시작하여 오른쪽으로 스크롤하면 이전 요소가 표시됩니다.
샘플:
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setReverseLayout(true);
_listView.setLayoutManager(linearLayoutManager);
상세한 것에 대하여는, 메뉴얼을 참조해 주세요.
답변이 늦었다는 것을 알고 있습니다.솔루션이 아래에 있는지 알고 싶은 사람이 있다면
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() - 1);
재사용 보기의 임의의 위치에서 아래로 스크롤하려면
코틀린
editText.setOnClickListener {
rv.postDelayed({
rv.scrollToPosition(rv.adapter.itemCount - 1)
}, 1000)
}
자바
edittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
rv.postDelayed(new Runnable() {
@Override
public void run() {
rv.scrollToPosition(rv.getAdapter().getItemCount() - 1);
}
}, 1000);
}
});
메시지를 보낸 후 서버에서 메시지를 받기 전에 이 코드 추가
recyclerView.scrollToPosition(mChatList.size() - 1);
했을 때setAdapter
패스를 하는 경우 (1개의 레이아웃 패스를 사용하는 ),scrollToPosition()
콜에는 호출 시 스크롤할 수 있는 실제 요소가 없습니다.
대신 ViewTreeObserver를 등록해야 합니다.OnGlobalLayoutListener(에서 addOnGlobalLayoutListner() 경유)ViewTreeObserver
성자에 의해 되었습니다.conversationView.getViewTreeObserver()
됩니다.scrollToPosition()
패스가 까지: "Layout Pass" : "Layout Pass" : "Layout Pass" (레이아웃 패스) :
conversationView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size();
// Unregister the listener to only call scrollToPosition once
conversationView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
// Use vto.removeOnGlobalLayoutListener(this) on API16+ devices as
// removeGlobalOnLayoutListener is deprecated.
// They do the same thing, just a rename so your choice.
}
});
Kotlin용 솔루션:
"recyclerView.adapter" 설정 후 또는 "recyclerView.adapter.notifyDataSetChanged()" 설정 후 아래 코드를 적용합니다.
recyclerView.scrollToPosition(recyclerView.adapter.itemCount - 1)
어댑터를 recycleerView에 접속하고 있는 경우는, 이 조작을 실시해 주세요.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
class MyLayoutManager extends LinearLayoutManager {
public MyLayoutManager(Context context) {
super(context, LinearLayoutManager.VERTICAL, false);
}
@Override public void smoothScrollToPosition(RecyclerView recyclerView,
final RecyclerView.State state, final int position) {
int fcvip = findFirstCompletelyVisibleItemPosition();
int lcvip = findLastCompletelyVisibleItemPosition();
if (position < fcvip || lcvip < position) {
// scrolling to invisible position
float fcviY = findViewByPosition(fcvip).getY();
float lcviY = findViewByPosition(lcvip).getY();
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
int currentState = RecyclerView.SCROLL_STATE_IDLE;
@Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (currentState == RecyclerView.SCROLL_STATE_SETTLING
&& newState == RecyclerView.SCROLL_STATE_IDLE) {
// recursive scrolling
smoothScrollToPosition(recyclerView, state, position);
}
currentState = newState;
}
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
int fcvip = findFirstCompletelyVisibleItemPosition();
int lcvip = findLastCompletelyVisibleItemPosition();
if ((dy < 0 && fcvip == position) || (dy > 0 && lcvip == position)) {
// stop scrolling
recyclerView.setOnScrollListener(null);
}
}
});
if (position < fcvip) {
// scroll up
recyclerView.smoothScrollBy(0, (int) (fcviY - lcviY));
} else {
// scroll down
recyclerView.smoothScrollBy(0, (int) (lcviY - fcviY));
}
} else {
// scrolling to visible position
float fromY = findViewByPosition(fcvip).getY();
float targetY = findViewByPosition(position).getY();
recyclerView.smoothScrollBy(0, (int) (targetY - fromY));
}
}
}
그리고.
MyLayoutManager layoutManager = new MyLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);
RecyclerView.Adapter adapter = new YourAdapter();
recyclerView.setAdapter(adapter);
recyclerView.smoothScrollToPosition(adapter.getItemCount() - 1);
위 코드는 작동하지만 매끄럽지 않고 쿨하지 않습니다.
Kotlin의 경우:
recyclerView.viewTreeObserver.addOnGlobalLayoutListener { scrollToEnd() }
private fun scrollToEnd() =
(adapter.itemCount - 1).takeIf { it > 0 }?.let(recyclerView::smoothScrollToPosition)
ROC의 답변이 큰 도움이 됩니다.여기에 작은 블록을 추가하고 싶습니다.
mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);
뷰의 높이가 같지 않은 경우 Layout Manager에서 scrollToPosition을 호출하면 맨 아래로 스크롤하여 마지막 항목을 모두 볼 수 있습니다.
recycler.getLayoutManager().scrollToPosition(adapter.getItemCount() - 1);
그 대답은.
recyclerView.scrollToPosition(arrayList.size() - 1);
다들 얘기했어요.
하지만 제가 직면한 문제는 그것이 올바르게 배치되지 않았다는 것입니다.
는 시험 바로 했다.adapter.notifyDataSetChanged();
그리고 그것은 성공하였다.재생기 보기의 데이터가 변경될 때마다 메시지를 보낸 후처럼 자동으로 맨 아래로 스크롤되거나 채팅 목록을 처음 엽니다.
주의: 이 코드는 Java에서 사용되었습니다.
실제 코드는 다음과 같습니다.
//scroll to bottom after sending message.
binding.chatRecyclerView.scrollToPosition(messageArrayList.size() - 1);
recycerview 스크롤을 최신 상태로 만드는 데 문제가 있는 경우 recycerview가 nestedScrollView 내부에 없는지 확인하십시오.그건 내 문제였어nested Scrollview를 삭제해야 했고, 그 후 아래 코드가 작동했습니다.
binding.recyclerView.scrollToPosition(adapter.getItemCount() - 1);
리사이클러 뷰에 처음 들어갈 때 스크롤 후 사용
linearLayoutManager.scrollToPositionWithOffset(messageHashMap.size()-1
위로 스크롤하려면 아래로 스크롤하려면 마이너스 입력);
뷰의 높이가 매우 큰 경우 화면 상단에 스크롤토포제이션 특정 오프셋이 사용됩니다.
int overallXScroldl =chatMessageBinding.rvChat.computeVerticalScrollOffset();
chatMessageBinding.rvChat.smoothScrollBy(0, Math.abs(overallXScroldl));
이것은 나에게 완벽하게 잘 작동한다.
AdapterChart adapterChart = new AdapterChart(getContext(),messageList);
recyclerView.setAdapter(adapterChart);
recyclerView.scrollToPosition(recyclerView.getAdapter().getItemCount()-1);
이 코드는 당신에게 가장 최근의 게시물을 먼저 줄 것입니다, 이 답변은 도움이 될 것입니다.
mInstaList=(RecyclerView)findViewById(R.id.insta_list);
mInstaList.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mInstaList.setLayoutManager(layoutManager);
layoutManager.setStackFromEnd(true);
layoutManager.setReverseLayout(true);
@galex 메서드를 시도했지만 리팩터링이 될 때까지 동작했습니다.그래서 나는 @yanchenco라는 대답을 쓰고 조금 바꿨다.아마도 이것은 내가 스크롤을 전화했기 때문일 것이다.onCreateView()
fragment 뷰가 구축되어 있습니다(아마도 사이즈가 적절하지 않을 수 있습니다).
private fun scrollPhotosToEnd(view: View) {
view.recycler_view.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.recycler_view.viewTreeObserver.removeOnGlobalLayoutListener(this)
} else {
@Suppress("DEPRECATION")
view.recycler_view.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
adapter?.itemCount?.takeIf { it > 0 }?.let {
view.recycler_view.scrollToPosition(it - 1)
}
}
})
}
하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 이런 도 할 수 요.viewTreeObserver.isAlive
https://stackoverflow.com/a/39001731/2914140 에서처럼요.
AppBarLayout
전에scrollToPosition
를 이용한다면
마지막 항목의 맨 아래로 스크롤할 수 있습니다. 마지막 항목의 높이가 너무 크면 오프셋해야 합니다.
private void scrollToBottom(final RecyclerView recyclerView) {
// scroll to last item to get the view of last item
final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
final RecyclerView.Adapter adapter = recyclerView.getAdapter();
final int lastItemPosition = adapter.getItemCount() - 1;
layoutManager.scrollToPositionWithOffset(lastItemPosition, 0);
recyclerView.post(new Runnable() {
@Override
public void run() {
// then scroll to specific offset
View target = layoutManager.findViewByPosition(lastItemPosition);
if (target != null) {
int offset = recyclerView.getMeasuredHeight() - target.getMeasuredHeight();
layoutManager.scrollToPositionWithOffset(lastItemPosition, offset);
}
}
});
}
너무 늦은 거 알지만 이게 효과가 있어서 이 질문에 대답하고 있습니다.
첫번째,
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
그 후에
database.addValueEventListener(....){
@override
public void onDataCange(...){
....
....
//put this line here
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount()-1);
}
}
코틀린을 사용한다면, 이것을 사용해 보세요.
conversationView.post {
scrollToPosition(conversationView?.adapter.itemCount - 1)
}
의 my직 my my my my my my my my my my my my my my my my my my my my 를 만들 수 있었다.RecyclerView
이치노 <고객명>님, <고객명>님RecyclerView
사용했을 때 나중에 스크롤할 수 없었습니다.scrollToPosition()
smoothScrollToPosition()
첫 번째 애니메이션은 성공했지만 목록이 길면 너무 느려졌어요.그 이유는 청취자가 제거되지 않았기 때문입니다.의 the래 the the i i the the the the the the the the the the the the the the the the the 를 삭제했습니다.ViewTreeObserver
력적매
mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mRecyclerView.scrollToPosition(mPosition);
mRecyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
이것들 중 아무 것도 효과가 없다면
다음을 사용해 보십시오.
ConstraintLayout targetView = (ConstraintLayout) recyclerView.findViewHolderForAdapterPosition(adapter.getItemCount()-1).itemView;
targetView.getParent().requestChildFocus(targetView, targetView);
이를 통해 특정 Constraint Layout(또는 가지고 있는 모든 것)을 표시할 것을 요구합니다.스크롤이 즉각적이다.
키보드가 표시되어 있어도 작업이 가능합니다.
최종 사용부터 시작하는 경우:
layoutManager.stackFromEnd = true
(코틀린 솔루션)
특히 이미지가 있는 경우 reverseLayout "채팅 인터페이스"를 사용하는 경우 다음을 시도할 수 있습니다.
먼저 어댑터에 DataObserver를 등록합니다.
chatAdapter.registerAdapterDataObserver(object :
RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int itemCount: Int) {
val messageCount: Int = chatAdapter.itemCount
val lastVisiblePosition: Int =
layoutManager.findLastCompletelyVisibleItemPosition()
if (lastVisiblePosition == -1 || positionStart <= (messageCount - 1)) {
recyclerView.scrollToPosition(positionStart)
}
}
})
어댑터의 데이터를 설정하면 호출됩니다.
둘째, 다음과 같이 recycleerView에 스크롤 청취자를 추가해야 합니다.
recyclerView.addOnScrollListener(object
:RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy:
Int) {
super.onScrolled(recyclerView, dx, dy)
val lastVisiblePosition: Int =
layoutManager.findLastCompletelyVisibleItemPosition()
if (lastVisiblePosition != -1 && lastVisiblePosition <
chatAdapter.itemCount - 1) {
recyclerView.smoothScrollToPosition(0)
}
}
})
간단한 해결을 위해 중력만을 이용하다
Android:flash_flash="하단"
언급URL : https://stackoverflow.com/questions/26580723/how-to-scroll-to-the-bottom-of-a-recyclerview-scrolltoposition-doesnt-work
'programing' 카테고리의 다른 글
Mockito.any() Generics와의 인터페이스 패스 (0) | 2022.08.03 |
---|---|
vue-ssr-renderer를 사용하여 웹 팩에서 생성된 Vue SSR 응용 프로그램에 서버 데이터/콘텍스트를 전달하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
Vuex 상태 변경 내용이 Vue 구성 요소 템플릿에 전파되지 않음 (0) | 2022.08.03 |
Google Guava vs.아파치 커먼즈 (0) | 2022.08.01 |
함수 정의에 대한 질문(파라미터의 점 세 개) (0) | 2022.08.01 |