【问题标题】:recyclerview returning same position on scrollrecyclerview 在滚动时返回相同的位置
【发布时间】:2018-05-21 18:31:23
【问题描述】:

大家好,我正在开发一个应用程序,我在其中使用 recyclerview 和 mapfragment。我已经制作了一个带有 recyclerview 和 onscroll 的轮播,我正在尝试根据特定项目的 LatLong 更改相机位置,现在我的问题是,当我每次滚动 recyclerview 时它都会返回相同的位置。我之前已经实现了 viewpager 并且我使用了 onPageSelected 方法,它工作得很好,但是现在我已经切换到 recyclerview 我遇到了这个问题。 我不知道我哪里错了 所以请如果有人可以在这里帮助我。 谢谢你

MainActivity 代码

carousel_recycler = (RecyclerView)findViewById(R.id.carousel_recycler);
        providers = new ArrayList<>();
        manager = new CenterZoomLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);
        final int scrollPosition = manager.findFirstVisibleItemPosition();
        carousel_recycler.setLayoutManager(manager);
        carousel_recycler.setHasFixedSize(true);
        place_data = getResources().getStringArray(R.array.nearby_place);
        for(String places : place_data){
            NearbyDataProvider nearbyDataProvider = new NearbyDataProvider(listItems[i],places,latitude[j],longitude[k]);
            providers.add(nearbyDataProvider);
            i++;
            j++;
            k++;
        }
        adapter = new CarouselRecycler_Adapter(providers);

        carousel_recycler.setAdapter(adapter);


        LinearSnapHelper snapHelper  = new LinearSnapHelper(){
            @Override
            public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
                View centerView = findSnapView(layoutManager);
                if (centerView == null)
                    return RecyclerView.NO_POSITION;

                int position = layoutManager.getPosition(centerView);
                int targetPosition = -1;
                if (layoutManager.canScrollHorizontally()) {
                    if (velocityX < 0) {
                        targetPosition = position - 1;
                    } else {
                        targetPosition = position + 1;
                    }
                }

                if (layoutManager.canScrollVertically()) {
                    if (velocityY < 0) {
                        targetPosition = position - 1;
                    } else {
                        targetPosition = position + 1;
                    }
                }

                final int firstItem = 0;
                final int lastItem = layoutManager.getItemCount() - 1;
                targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
                return targetPosition;
            }
        };
        snapHelper.attachToRecyclerView(carousel_recycler);
       carousel_recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
           @Override
           public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
               super.onScrollStateChanged(recyclerView, newState);



               index  = newState;
               if(providers.size()>0){
                   if(!providers.get(index).getLattitude().isEmpty()
                           && !providers.get(index).getLongitude().isEmpty()){
                       double lat = Double.parseDouble(providers.get(index).getLattitude());
                       double lang = Double.parseDouble(providers.get(index).getLongitude());
                       changeCameraPosition(lat,lang);
                   }
                   else {
                       Toast.makeText(MapsMarkerActivity.this, "No last location found", Toast.LENGTH_SHORT).show();
                   }
               }
           }

           @Override
           public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
               super.onScrolled(recyclerView, dx, dy);

               /*index  = scrollPosition;
               if(providers.size()>0){
                   if(!providers.get(scrollPosition).getLattitude().isEmpty()
                           && !providers.get(scrollPosition).getLongitude().isEmpty()){
                       double lat = Double.parseDouble(providers.get(scrollPosition).getLattitude());
                       double lang = Double.parseDouble(providers.get(scrollPosition).getLongitude());
                       changeCameraPosition(lat,lang);
                   }
                   else {
                       Toast.makeText(MapsMarkerActivity.this, "No last location found", Toast.LENGTH_SHORT).show();
                   }
               }*/
           }
       });
    }

【问题讨论】:

    标签: java android


    【解决方案1】:

    这会解决您的问题吗?

    rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
    
    
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
    
            try {
    
                LinearLayoutManager layoutManager = ((LinearLayoutManager) rv.getLayoutManager());
                int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
    
    
                Log.e("refresh", "State - " + newState + " : firstVisiblePosition" + firstVisiblePosition);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    });

    【讨论】:

    • 嘿,感谢您的回复,但我尝试了 firstVisibleItemPosition,但由于某种原因,在滚动后它给出了 arrayoutof bounds 异常..
    • 您可以在访问数组之前添加检查。如果 array.size>position 则只能访问它。顺便说一句,填充recyclerview的数组是同一个数组吗?
    • 哇,它的工作非常感谢,一件令人毛骨悚然的事情是我的第一个和最后一个定位的项目没有被计算在内,我的意思是他们没有被选中
    • 数组列表计数将从0开始,所以我认为size-1是你的最后一个元素,0是你的第一个元素。
    • LinearSnapHelper 不允许我选择第一个和最后一个项目,所以当它从两个项目中选择一个项目时我应该怎么做
    猜你喜欢
    • 2013-07-02
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多