首页 > 解决方案 > recyclerview 在滚动时返回相同的位置

问题描述

大家好,我正在开发一个应用程序,我在其中使用 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();
                   }
               }*/
           }
       });
    }

标签: javaandroid

解决方案


这会解决你的问题吗?

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

});


推荐阅读