Как объявить overridePendingTransition внутри onBindViewHolder адаптера RecyclerView?
Я создал объект намерения вместе с Bundle
когда CardView
нажимается, а затем я начинаю Activity
, Как мне объявить overridePendingTransition
внутри него? Код дан ниже:
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.textView.setText(strings[position]);
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(holder.itemView.getContext(),SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("list",strings[position]);
intent.putExtras(bundle);
holder.itemView.getContext().startActivity(intent);
//overridePendingTransition(R.anim.abc_fade_in,R.anim.abc_fade_out);
}
});
}
4 ответа
Вы должны пройти Activity
на ваш RecyclerView.Adapter
класс при объявлении это как:
Прежде всего, в конструкторе вашего адаптера добавить Activity
поле:
public class MyAdapter extends RecyclerView.Adapter{
Activity mActivity;
ArrayList<YourModel> models;
public MyAdapter(ArrayList<YourModel> models,Activity mActivity){
this.mActivity=mActivity;
this.models=models;
}
}
Затем добавьте эту строку в свой Activity
:
Activity thisActivity=(Activity)this;
Тогда в вашем Activity
объявите свой адаптер как:
MyAdapter myAdapter=new MyAdapter(models,thisActivity);
И, наконец, вы можете использовать это Activity
в вашем адаптере для перехода вроде:
mActivity.overridePendingTransition();
Это то, что сработало для меня, возможно, не лучший способ сделать это, но, по крайней мере, это работает. В этом случае parent - это родительский макет, который содержит все элементы, но вы можете установить прослушиватель щелчка для любого представления.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
class ViewHolder extends RecyclerView.ViewHolder {
ConstraintLayout parent;
...
ViewHolder(View itemView) {
super(itemView);
parent = itemView.findViewById(R.id.parent);
...
}
}
private Context mContext;
...
public MyAdapter(Context context, List<Something> something) {
mContext = context;
...
}
...
private Context getContext() {
return mContext;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int position) {
...
viewHolder.parent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getContext(), SomeActivity.class);
getContext().startActivity(intent);
((Activity) getContext()).overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
});
}
Из документации
Вызовите сразу после одного из вариантов startActivity(Intent) или finish(), чтобы указать явную анимацию перехода, которую нужно выполнить дальше.
Вы должны назвать это с контекстом.
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.textView.setText(strings[position]);
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(holder.itemView.getContext(),SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("list",strings[position]);
intent.putExtras(bundle);
holder.itemView.getContext().startActivity(intent);
mContext.overridePendingTransition(R.anim.abc_fade_in,R.anim.abc_fade_out);
}
});
}
usersviewHolder.mview.setOnClickListener(new View.OnClickListener(){
public Activity mContext;
@Override
public void onClick(View view){
Intent eventpage_intent = new Intent(EventFragment.this.getActivity(), Event_Main_Page.class);
eventpage_intent
startActivity(eventpage_intent);
mContext = (Activity) usersviewHolder.itemView.getContext();
mContext.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
});
Это сработало