使用SnapHelper选择项目时,在Viewholder中调用函数

问题描述 投票:0回答:1

我有一个使用SnapHelper实现的水平Recycler视图来获得carousal效果。在我的ViewHolder中,我有一个功能来为Recycler项目内的视图设置动画。所以每当一个项目在SnapHelper中滚动到中心(选中)时,我需要启动动画。我尝试过以下代码,但它不起作用。有时我将viewholder视为null。

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

            if (newState == RecyclerView.SCROLL_STATE_SETTLING) {

                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        int pos = ((LinearLayoutManager) widgetScrollView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();

                        ResultTallyAdapter.ViewHolder viewHolder = (ResultTallyAdapter.ViewHolder) recyclerView.findViewHolderForAdapterPosition(pos);
                        viewHolder.startAnimation(MainActivity.this, pos);
                    }
                }, 1000);

            }
        }

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

        }
    });
android android-recyclerview android-viewholder
1个回答
0
投票

我和你一样尝试着同样的事情。但代码是不同的。我使用SnapHelper查找当前视图并从此视图获取位置,并通过此位置开始对适配器进行操作。您可以了解以下代码,可能会对您有所帮助

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

            synchronized (this) {
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    //calculatePositionAndScroll(recyclerView);

                    View view = snapHelper.findSnapView(recyclerView.getLayoutManager());
                    if (view != null) {
                        int pos = recyclerView.getLayoutManager().getPosition(view);
                        Log.d("RecyclerViewTest", "position: " + pos + "  item: " + itemList.get(pos).getName());

                        makeSelectedItem(pos); // do your stuff on this view
                       // adapter.notifyDataSetChanged();


                    }

                }
            }
        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.