[java] RecyclerView의 맨 아래로 스크롤하는 방법? scrollToPosition이 작동하지 않습니다

활동을로드 한 후 RecyclerView 목록의 맨 아래로 스크롤하고 싶습니다.

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(...)RecyclerView에서 지원되지 않는 것에 대한 예외를 throw하고 conversationView.scrollToPosition(...)아무것도하지 않는 것 같습니다.

위의 코드 블록 뒤에 추가했습니다

conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)

작동하지 않습니다. 에 30 개의 요소가 GENERIC_MESSAGE_LIST있습니다.



답변

그냥 설정 setStackFromEnd=true또는 setReverseLayout=true너무 LLM은 끝에서 항목을 레이아웃 것이다.

이 두 가지의 차이점 setStackFromEnd은 마지막 요소를 표시하도록보기를 설정하고 레이아웃 방향이 동일하게 유지된다는 것입니다. (왼쪽에서 오른쪽으로 가로 리사이클 러보기에서 마지막 요소가 표시되고 왼쪽으로 스크롤하면 이전 요소가 표시됩니다)

반면 setReverseLayout어댑터가 추가 한 요소의 순서는 변경됩니다. 레이아웃은 LTR Recycler View에서 가장 왼쪽에있는 마지막 요소에서 시작한 다음 오른쪽으로 스크롤하면 이전 요소가 표시됩니다.

견본:

final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setReverseLayout(true);
_listView.setLayoutManager(linearLayoutManager);

자세한 내용은 설명서 를 참조하십시오.


답변

나는이 게시물을보고 답을 찾았지만 …이 게시물의 모든 사람들이 나와 같은 시나리오에 직면했다고 생각합니다 scrollToPosition(). 명백한 이유로 완전히 무시되었습니다.

내가 무엇을 사용하고 있었습니까?

recyclerView.scrollToPosition(items.size());

… 무슨 일 했어요 ?

recyclerView.scrollToPosition(items.size() - 1);


답변

해결책을 알고 싶은 사람이 있다면 아래 답변이 늦습니다.

conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() - 1);


답변

recyclerview의 임의의 위치에서 아래로 스크롤하려면

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하면 화면에 항목을 즉시 배치하고 배치하지 않습니다 (단일 레이아웃 패스가 필요함) scrollToPosition(). 호출 할 때 스크롤 할 실제 요소가 없습니다.

대신 ViewTreeObserver.OnGlobalLayoutListener를 (에 의해 생성 된 addOnGlobalLayoutListner () 를 통해) 등록해야 첫 번째 레이아웃 통과 후까지 지연됩니다 .ViewTreeObserverconversationView.getViewTreeObserver()scrollToPosition()

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


답변

코 틀린 솔루션 :

“recyclerView.adapter”를 설정 한 후 또는 “recyclerView.adapter.notifyDataSetChanged ()”이후에 아래 코드를 적용하십시오.

recyclerView.scrollToPosition(recyclerView.adapter.itemCount - 1)