Android共享元素转换supportFinishAfterTransition()转换为错误的项目

时间:2016-04-19 09:42:15

标签: android

如果有人能帮助我,我会很高兴。 (我是编程btw的新手)

概述

我有一个包含许多项目的RecyclerView。在我的MainActivity上,我展示了RecyclerView。当我单击某个项目时,该应用程序将移动到DetailActivity以显示有关特定项目的更多详细信息。

当我从一个Activity移动到另一个Activity时,我想使用共享元素转换。 当我点击第1项时,第1项是转换中的共享元素。当调用supportFinishAfterTransition时,我希望Item 1在从DetailActivity过渡到MainActivity的过程中保持为共享元素。

我最初能够实现目标,直到我的setReverseLayout和setStackFromEnd为真。现在,正向转换是正确的,但在向后转换时,交换共享元素转换的项目。

即。假设我有三个项目,1,2,3。在前进时,1变为1.向后,1变为3.

对于3,向前,3进入3.向后,3进入1.

我需要帮助解决这个问题。

守则

设置RecyclerView的代码

//setting up RecyclerView
    rv = (RecyclerView) findViewById(R.id.rv);
    LinearLayoutManager llm = new LinearLayoutManager(this);
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    llm.setReverseLayout(true);
    llm.setStackFromEnd(true);
    rv.setLayoutManager(llm);
    rv.setHasFixedSize(true);

    if (DataForAlarms.myAlarmsList.size() != 0) {
        final RVAdapter adapter = new RVAdapter(DataForAlarms.myAlarmsList);
        rv.setAdapter(adapter);

        //sets up Item clicking
        rv.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), rv, new ClickListener() {
            @Override
            public void onClick(View view, int position) {

                Alarms alarm = DataForAlarms.myAlarmsList.get(position);
                if(alarm.isAcknowledged()) {
                    Intent i = new Intent(view.getContext(), DetailActivity.class);
                    i.putExtra(DetailActivity.ID, alarm.getID());

                    String myTransitionName = "";
                    //Transition code from main to detail activity
                    if(Build.VERSION.SDK_INT > 20){

                        myTransitionName = getString(R.string.transition_alarm_card) + String.valueOf(position);
                        view.findViewById(R.id.alertImage).setTransitionName(myTransitionName);
                        i.putExtra(UNIQUE_TRANSITION_NAME,myTransitionName);
                        Log.e("Transition",myTransitionName);
                    }

                    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(

                            MainActivity.this,

                            // For each shared element, add to this method a new Pair item,
                            // which contains the reference of the view we are transitioning *from*,
                            // and the value of the transitionName attribute
                            new Pair<>(view.findViewById(R.id.alertImage),
                                    myTransitionName)

                    );

                    i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                    ActivityCompat.startActivity(MainActivity.this, i, options.toBundle());
                } else{
                    view.setEnabled(false);
                }
            }

在detailActivity上设置转换名称的代码

//set transition name
    String myTransitionName = getIntent().getExtras().getString(MainActivity.UNIQUE_TRANSITION_NAME);
    Log.e("Transition",myTransitionName);

    //to exclude status bar and navigation bar from transition
    if(Build.VERSION.SDK_INT>20){
        alertImage.setTransitionName(myTransitionName);
        Transition fade = new Fade();
        fade.excludeTarget(android.R.id.statusBarBackground, true);
        fade.excludeTarget(android.R.id.navigationBarBackground, true);
        getWindow().setExitTransition(fade);
        getWindow().setEnterTransition(fade);
    }

最后,返回的代码

//allow clicking on cv to go back to MainActivity
    cv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(v.getContext(),MainActivity.class);
            i.putExtra(DetailActivity.ID, alarm.getID());
            supportFinishAfterTransition();
        }
    });

打算如何
enter image description here
https://i.imgur.com/rUkkfUZ.gif

在上面的gif(信用到代码路径)中,第2项是前向和后向过渡的共享元素。发生在我身上的是,1是向前,但是3在向后。但是当3在向前时,1在向后。

提前致谢

0 个答案:

没有答案