programing

RecyclerView에서 보이는 항목 가져오기

iphone6s 2023. 10. 29. 19:05
반응형

RecyclerView에서 보이는 항목 가져오기

현재 내 Recycler View에 어떤 요소가 표시되어 있는지 알아야 합니다.ListViews에는 메소드와 동등한 메소드가 없습니다.작업을 해보았지만 그 해킹은 너무 추하고 항상 작동하는 것도 아닙니다.

누구 아이디어 있어요?

첫 번째/마지막 눈에 보이는 자식은 다음에 따라 달라집니다.LayoutManager. 사용하시는 경우LinearLayoutManager아니면GridLayoutManager, 사용가능

int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();

예를 들어,

GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();

위해서LinearLayoutManager, 첫 번째/마지막은 어댑터 순서에 따라 달라집니다.다음에서 하위 항목을 쿼리하지 않음RecyclerView;LayoutManager캐싱을 위해 보이는 것보다 더 많은 항목을 레이아웃 하는 것을 선호할 수 있습니다.

RecyclerView 어댑터 내부에 구현할 논리가 있는 사용자의 경우 @ernes to approach를 on scrollListener와 결합하여 얻을 수 있습니다.what you wantRecyclerView를 참조합니다.어댑터 안에는 다음과 같은 것이 들어있습니다.

@Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if(manager instanceof LinearLayoutManager && getItemCount() > 0) {
            LinearLayoutManager llm = (LinearLayoutManager) manager;
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }

                @Override
                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                        int visiblePosition = llm.findFirstCompletelyVisibleItemPosition();
                        if(visiblePosition > -1) {
                            View v = llm.findViewByPosition(visiblePosition);
                            //do something
                            v.setBackgroundColor(Color.parseColor("#777777"));
                        }
                }
            });
        }
    }

마지막으로 onBindView에서 현재 항목이 표시되는지 확인할 수 있는 솔루션을 찾았습니다.어댑터의 홀더 이벤트.

핵심은 View Partial Visible from Layout Manager입니다.

어댑터에서 RecyclerView에서 Layout Manager를 가져올 수 있으며, 이는 onAttachedToRecyclerView 이벤트에서 매개 변수로 가져옵니다.

사용가능recyclerView.getChildAt()각각의 눈에 보이는 아이를 얻고, 태그를 설정합니다.convertview.setTag(index)어댑터 코드에 있는 이러한 뷰는 어댑터 데이터와 관련시키는 데 도움이 될 것입니다.

부록:

제안된 함수가 마지막을 찾습니다.도구 모음이 확장되는 동안 접히는 도구 모음이 있는 시나리오에서는 위치()가 올바르게 작동하지 않습니다.

재활용자 보기는 높이가 고정되어 있고 도구 모음이 확장되는 동안 재활용자가 화면 밖으로 부분적으로 아래로 이동되는 것 같습니다.결과적으로 제안된 함수의 결과가 너무 높습니다.예:마지막으로 보이는 항목은 #9라고 하지만, 사실 #7 항목이 화면에 마지막으로 표시되는 항목입니다.

이러한 동작은 내 보기가 올바른 위치로 스크롤하지 못하는 경우가 많았던 이유이기도 합니다. 즉, 스크롤ToPosition()이 올바르게 작동하지 않았습니다(마침내 프로그램적으로 도구 모음을 접었습니다).

위의 모든 답변이 맞으며 제 작업 코드에서 스냅샷도 추가하고 싶습니다.

recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
           // Some code when initially scrollState changes
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            // Some code while the list is scrolling
            LinearLayoutManager lManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            int firstElementPosition = lManager.findFirstVisibleItemPosition();
            
        }
    });

다음에 나오는Linear / Grid LayoutManager메소드를 사용하여 어떤 아이템이 있는지 확인할 수 있습니다.visible.

int findFirstVisibleItemPosition();
int findLastVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();

그리고 만약 추적하고 싶다면,is item visible on screen일부 임계값에 대해서는 다음 블로그를 참조할 수 있습니다.

https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05

위해서StaggeredGridLayoutManager다음 작업을 수행합니다.

RecyclerView rv = findViewById(...);
StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(...);
rv.setLayoutManager(lm);

항목 보기를 보려면 다음을 수행합니다.

int[] viewsIds = lm.findFirstCompletelyVisibleItemPositions(null);
ViewHolder firstViewHolder = rvPlantios.findViewHolderForLayoutPosition(viewsIds[0]);
View itemView = viewHolder.itemView;

비어 있는지 확인하는 것을 기억하세요.

코틀린에서 답을 찾고 계신 분들께:

fun getVisibleItem(recyclerView : RecyclerView) {
        recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                 if(newState == RecyclerView.SCROLL_STATE_IDLE) {
                     val index = (recyclerView.layoutManager.findFirstVisibleItemPosition
                     //use this index for any operation you want to perform on the item visible on screen. eg. log(arrayList[index])
                 }
            }
        })
    }

사용 사례에 따라 해당 직위를 얻는 다른 방법을 살펴볼 수 있습니다.

int findFirstCompletelyVisibleItemPosition()
int findLastVisibleItemPosition()
int findLastCompletelyVisibleItemPosition()

재활용 보기의 첫 번째와 마지막으로 보이는 하위 항목을 찾을 수 있으며 원하는 보기가 다음 범위에 있는지 확인할 수 있습니다.

var visibleChild: View = rv.getChildAt(0)
val firstChild: Int = rv.getChildAdapterPosition(visibleChild)
visibleChild = rv.getChildAt(rv.childCount - 1)
val lastChild: Int = rv.getChildAdapterPosition(visibleChild)
println("first visible child is: $firstChild")
println("last visible child is: $lastChild")

눈에 보이는 아이템 위치가 아이템 위치와 다를 경우 토스트 메시지가 화면에 표시됩니다.

myRecyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);

            LinearLayoutManager manager= (LinearLayoutManager) myRecyclerview.getLayoutManager();
            assert manager != null;
            int visiblePosition = manager.findLastCompletelyVisibleItemPosition();


            if(visiblePosition > -1&&a!=visiblePosition) {
                Toast.makeText(context,String.valueOf(visiblePosition),Toast.LENGTH_SHORT).show();
                //do something
                a=visiblePosition;

            }
        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //Some code while the list is scrolling


        }
    });

언급URL : https://stackoverflow.com/questions/24989218/get-visible-items-in-recyclerview

반응형