如何在 RecyclerView 适配器的 onBindViewHolder 中声明 overridePendingTransition?

How to declare overridePendingTransition inside onBindViewHolder of a RecyclerView adapter?

CardView 被点击时,我创建了一个 intent 对象和 Bundle,然后我启动了 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);
        }
    });
}

来自Documentation

Call immediately after one of the flavors of startActivity(Intent) or finish() to specify an explicit transition animation to perform next.

需要结合上下文调用。

@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); 
    } 
}); 
} 

您必须将 Activity 传递给您的 RecyclerView.Adapter class 声明时:

首先在适配器的构造函数中添加 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();
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);
    }
});

这有效

这对我有用,可能不是最好的方法,但至少它有效。在这种情况下,父布局是包含所有项目的父布局,但您可以将点击侦听器设置为任何视图。

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);
            }
        });
    }