如果有人能帮助我,我会很高兴。 (我是编程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();
}
});
打算如何
https://i.imgur.com/rUkkfUZ.gif
在上面的gif(信用到代码路径)中,第2项是前向和后向过渡的共享元素。发生在我身上的是,1是向前,但是3在向后。但是当3在向前时,1在向后。
提前致谢