RecyclerView的setScrollToPositionWithOffset

如果你看到这篇文章,请你帮我分析一下,猜测的也可以,当然有大神一下锁定问题所在,感激不尽问题描述:在学习一个Demo,Onboading,ViewPager滑动到第三页时,通过调用LinearLayout.scrollToPositionWithOffset,滑动ViewPager,让RecyclerView跟着滑动。可我模仿它的代码,却发现如果我滑动到这个页面,调用这个函数,会导致分配给应用的内存
摘要由CSDN通过智能技术生成

如果你看到这篇文章,请你帮我分析一下,猜测的也可以,当然有大神一下锁定问题所在,感激不尽

问题描述:在学习一个Demo,Onboading,ViewPager滑动到第三页时,通过调用LinearLayout.scrollToPositionWithOffset,滑动ViewPager,让RecyclerView跟着滑动。可我模仿它的代码,却发现如果我滑动到这个页面,调用这个函数,会导致分配给应用的内存迅速增加,50MB>>>90MB.而我不调用这个函数时,一切正常。这个程序在华为(6.0)上运行,滑到第三页时,会卡顿,接着再来回滑动两三次就会闪退。但是在oppo(4.3)上面却没什么问题。 接着我猜测是因为加载本地图片太多太大导致的,于是我用了Glide加载本地图片。结果一切正常,Memory也稳定在50MB左右。在华为手机上也能运行正常。 原因似懂非懂,可能是我还没有学到的知识点。

注:加载的图片是本地的。

Demo的fragment

public class SceneThreeFragment extends BaseSceneFragment {
   

    private static final int SCROLL_OFFSET = 200;

    private Point transitionDistance;
    private int scrollOffsetX;
    private int finishWidth, finishHeight;

    private FragmentSceneThreeBinding binding;

    public static SceneThreeFragment newInstance(int position) {
        SceneThreeFragment scene = new SceneThreeFragment();

        Bundle args = new Bundle();
        args.putInt(KEY_POSITION, position);
        scene.setArguments(args);

        return scene;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
        binding =
                DataBindingUtil.inflate(inflater, R.layout.fragment_scene_three, container, false);

        setRootPositionTag(binding.root);

        setRecyclerView(binding.recycler1, getResources().obtainTypedArray(R.array.images_1));
        setRecyclerView(binding.recycler2, getResources().obtainTypedArray(R.array.images_2));
        setRecyclerView(binding.recycler3, getResources().obtainTypedArray(R.array.images_3));
        setRecyclerView(binding.recycler4, getResources().obtainTypedArray(R.array.images_4));
        setRecyclerView(binding.recycler5, getResources().obtainTypedArray(R.array.images_5));

        if (savedState != null) {
            transitionDistance = savedState.getParcelable("transitionDistance");
            finishWidth = savedState.getInt("finishWidth");
            finishHeight = savedState.getInt("finishHeight");
            scrollOffsetX = savedState.getInt("scrollOffsetX");

            moveScrollViews(0);

            // make sure finish view is invisible
            ImageView finishView =
                    (ImageView) binding.recycler2.getLayoutManager().findViewByPosition(3);
            if (finishView != null) {
                finishView.setVisibility(View.INVISIBLE);
            }
            Log.e("Three","OncreteView invoked");
        }

        return binding.getRoot();
    }

    private void setRecyclerView(RecyclerView recyclerView, TypedArray drawables) {
        LinearLayoutManager layoutManager =
                new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);

        recyclerView.setLayoutManager(layoutManager);
        ImageAdapter adapter = new ImageAdapter(drawables);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putParcelable("transitionDistance", transitionDistance);
        outState.putInt("scrollOffsetX", scrollOffsetX);
        outState.putInt("finishWidth", finishWidth);
        outState.putInt("finishHeight", finishHeight);
    }

    @Override
    public void enterScene(ImageView sharedElement, float position) {
        if (transitionDistance == null) {
            setTransition(sharedElement);
        }

        binding.root.setAlpha(1 - position);

        sharedElement.setX(transitionDistance.x * (1 - position));
        sharedElement.setY(-getResources().getDimension(R.dimen.tutorial_shared_element_translate_y)
                + (transitionDistance.y * (1 - position)));
        scaleSharedElement(position, sharedElement);
        setSharedImageRadius(sharedElement, position);

        moveScrollViews(position);
    }

    private void setTransition(ImageView sharedElement) {
        // get the finish view
        ImageView finishView =
                (ImageView) binding.recycler2.getLayoutManager().findViewByPosition(3);
        finishView.setVisibility(View.INVISIBLE);

        finishHeight = finishView.getHeight();
        finishWidth = finishView.getWidth();

        Point finishViewLocation = ViewHelper.getViewLocation(finishView);

        // find the point of the screen(middle - half image) and for final point to be centered
        int screenCenterX = ViewHelper.getDisplaySize(getActivity()).x / 2;
        int finishWidth = finishView.getWidth() / 2;
        int finishX = screenCenterX - finishWidth;

        // the distance the recyclerview needs to scroll for the finish view to be centered
        scrollOffsetX = finishX - finishViewLocation.x;

        Point sharedLocation = ViewHelper.getViewLocation(sharedElement);
        transitionDistance = new Point();
        transitionDistance.x = finishX - sharedLocation.x;
        transitionDistance.y = finishViewLocation.y - sharedLocation.y;
    }

    @Override
    public void centerScene(ImageView sharedElement) {
        binding.root.setAlpha(1.0f);

        // make sure shared element is set in the correct place
        sharedElement.setX(transitionDistance.x);
        sharedElement.setY(-getResources().getDimension(R.dimen.tutorial_shared_element_translate_y)
                + transitionDistance.y);
        scaleSharedElement(0, sharedElement);

        setSharedImageRadius(sharedElement, 0);
        moveScrollViews(0);
    }

    //position goes from -1.0 to 0.0
    @Override
    public void exitScene(ImageView sharedElement, float position) {
        // last scene, it wont exit
    }

    @Override
    public void notInScene() {
        // reset scroll views
        moveScrollViews(1.0f);
        binding.root.setAlpha(0);
    }

    private void moveScrollViews(float position) {
        // use and odd and even scroll so images don't end up perfectly aligned
        int scroll = (int) (scrollOffsetX * (1 - position) + SCROLL_OFFSET);

        scrollRecycleViewTo(binding.recycler1, -scroll);
        scrollRecycleViewTo(binding.recycler2, scroll);
        scrollRecycleViewTo(binding.recycler3, -scroll);
        scrollRecycleViewTo(binding.recycler4, scroll);
        scrollRecycleViewTo(binding.recycler5, -scroll);
        Log.e("Scroll","Scroll:"+scroll);
    }

    private void scrollRecycleViewTo(RecyclerView recyclerView, int offset) {
        LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
        layoutManager.scrollToPositionWithOffset(2, offset);
    }

    private void scaleSharedElement(float position, ImageView sharedElement) {
        float scaleX = 1 - ((float) finishWidth / sharedElement.getWidth());
        float scaleY = 1 - ((float) finishHeight / sharedElement.getHeight());

        // scale around the center
        sharedElement.setPivotX(1.0f);
        sharedElement.setPivotY(1.0f);

        // scale the shared image to the finish views size
        sharedElement.setScaleX((1 - (scaleX * (1 - position))));
        sharedElement.setScaleY((1 - (scaleY * (1 - position))));
    }
}

Demo的ImageAdapter

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {
   

    private TypedArray images;

    public ImageAdapter(TypedArray dataSet) {
        images = dataSet;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.row_image, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.image.setImageDrawable(images.getDrawable(position));
    }

    @Override
    public int getItemCount() {
        return images.length();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
   

        public ImageView image;

        public ViewHolder(View view) {
            super(view);
            image = (ImageView) view;
        }
    }
}

我的Fragment

public class FragmentThree extends BaseFragment{
   
private View root;
private RecyclerView recycler1;
private RecyclerView recycler2;
private RecyclerView recycler3;
private RecyclerView recycler4;
private RecyclerView recycler5;

private int scrollOffsetX;
private Point sharedElemScrollPoint;
private int finishHeight;
private int finishWidth;

public static FragmentThree newInstance(int position){
    FragmentThree scene = new FragmentThree();

    Bundle args = new Bundle();
    args.putInt(KEY_POSITION, position);
    scene.setArguments(args);

    return scene;
}
@Override
public int getLayoutId() {
    return R.layout.fragment_three;
}

@Override
public void init(View view) {
    root=view.findViewById(R.id.root);
    setRootPositionTag(root);
    if(root==view){
        Log.e("SAME","SAME");
    }

    recycler1=(RecyclerView) view.findViewById(R.id.recycler_1);
    recycler2=(RecyclerView) view.findViewById(R.id.recycler_2);
    recycler3=(RecyclerView) view.findViewById(R.id.recycler_3);
    recycler4=(RecyclerView) view.findViewById(R.id.recycler_4);
    recycler5=(RecyclerView) view.findViewById(R.id.recycler_5);
    setRecyclerView(recycler1,getResources().obtainTypedArray(R.array.images_1));
    setRecyclerView(recycler2,getResources().obtainTypedArray(R.array.images_2));
    setRecyclerView(recycler3,getResources().obtainTypedArray(R.array.images_3));
    setRecyclerView(recycler4,getResources().obtainTypedArray(R.array.images_4));
    setRecyclerView(recycler5,getResources().obtainTypedArray(R.array.images_5));
}

private void setRecyclerView(RecyclerView recyclerView, TypedArray drawables) {
    LinearLayoutManager layoutManager =
            new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);

    recyclerView.setLayoutManager(layoutManager);
    ImageAdapter adapter = new ImageAdapter(drawables);
    recyclerView.setAdapter(adapter);
}


@Override
public void enter(@Nullable ImageView shareElem, float position) {

    if(sharedElemScrollPoint==
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值