Использование общих переходов элементов из класса неактивности в класс активности
У меня есть класс неактивности (точнее, адаптер RecyclerView, содержащий изображения карт), я пытаюсь использовать переход "подлинное движение" от просмотра карты до конечного действия с использованием элемента общего изображения. Я легко реализовал это между двумя классами активности, но от класса неактивности до класса активности я не могу это сделать?
Вот мой код (RecyclerViewAdapter.java):
открытый класс RVAdapter расширяет RecyclerView.Adapter {
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView personName;
TextView personAge;
ImageView personPhoto;
TextView myid;
front ft = new front();
PersonViewHolder(View itemView) {
super(itemView);
personName = (TextView)itemView.findViewById(R.id.person_name);
personAge = (TextView)itemView.findViewById(R.id.person_age);
personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);
myid = (TextView)itemView.findViewById(R.id.IDTAG);
cv = (CardView)itemView.findViewById(R.id.cv);
cv.setUseCompatPadding(true);
cv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String cardid = myid.getText().toString().trim();
Intent callIntent = new Intent("io.brushed.databasecardview.VIEWDATAINSIDE");
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
callIntent.putExtra("THEID",cardid);
String transitionName = "oktrans";
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this,
personPhoto, // The view which starts the transition
transitionName // The transitionName of the view we’re transitioning to
);
ActivityCompat.startActivity(this, callIntent, options.toBundle());
}
});
}
}
List<Person> persons;
RVAdapter(List<Person> persons){
this.persons = persons;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.myid.setText(persons.get(i).id);
personViewHolder.personName.setText(persons.get(i).name);
personViewHolder.personAge.setText(persons.get(i).age);
personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
}
@Override
public int getItemCount() {
return persons.size();
}
}
Он не может разрешить ключевое слово "this", чем я должен заменить его, так как адаптер RecyclerView является неактивным классом?
2 ответа
Вы можете передать контекст вашего класса активности вашему неактивному классу (в частности, адаптеру RecyclerView, содержащему просмотры карт)
например
RecyclerViewAdapter1(Context context...)
Затем используйте этот контекст для этой цели:
String transitionName = "oktrans";
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this,
personPhoto,transitionName);
ActivityCompat.startActivity(context, callIntent, options.toBundle());
Редактировать:
На основании вашего нового редактирования.
Передайте активность в качестве аргумента.
PersonalViewHolder(View view, Activity activity) {
...
ActivityCompat.startActivity(activity, ...);
}
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView personName;
TextView personAge;
ImageView personPhoto;
TextView myid;
front ft = new front();
PersonViewHolder(View itemView, final Context context) {
super(itemView);
personName = (TextView)itemView.findViewById(R.id.person_name);
personAge = (TextView)itemView.findViewById(R.id.person_age);
personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);
myid = (TextView)itemView.findViewById(R.id.IDTAG);
cv = (CardView)itemView.findViewById(R.id.cv);
cv.setUseCompatPadding(true);
cv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String cardid = myid.getText().toString().trim();
Intent callIntent = new Intent("io.brushed.databasecardview.VIEWDATAINSIDE");
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
callIntent.putExtra("THEID",cardid);
String transitionName = "oktrans";
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(context,
personPhoto, // The view which starts the transition
transitionName // The transitionName of the view we’re transitioning to
);
ActivityCompat.startActivity(context, callIntent, options.toBundle());
}
});
}
}
List<Person> persons;
RVAdapter(List<Person> persons){
this.persons = persons;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v, viewGroup.getContext());
return pvh;
}
@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.myid.setText(persons.get(i).id);
personViewHolder.personName.setText(persons.get(i).name);
personViewHolder.personAge.setText(persons.get(i).age);
personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
}
@Override
public int getItemCount() {
return persons.size();
}
}
Вы не можете использовать this
потому что вы находитесь внутри блока, который содержит ссылку на него.
Также, если вы видите правильную реализацию метода startActivity().
Для этого нужны следующие аргументы:
startActivity(Activity activity, Intent intent, Bundle options)
Передайте свою активность как ActivityName.this
или же getActivity()
если во фрагменте
Редактировать:
На основании вашего нового редактирования.
Передайте активность в качестве аргумента.
PersonalViewHolder(View view, Activity activity) {
...
ActivityCompat.startActivity(activity, ...);
}