Как объявить 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);
    }
});

Это сработало

Другие вопросы по тегам