从 RecyclerView Adapter 而不是 Activity 调用过渡动画
Call transition animation from RecyclerView Adapter instead of Activity
在我制作的自定义 RecyclerView (RV) 适配器的帮助下,我有一个带有 RecyclerView 的应用程序,里面装满了一些卡片。
然后我尝试按照 this tutorial 添加活动之间的转换。但是,如教程中所示,在 Activity 中创建 Intent 时会调用动画,而我的 OnClick 代码在 RVAdapter 中。这使我无法访问方法
所需的 Activity
Intent intent = new Intent(HomeActivity.this, TargetActivity.class);
intent.putExtra(TargetActivity.ID, Contact.CONTACTS[position].getId());
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
// the context of the activity
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, String>(view.findViewById(R.id.CONTACT_circle),
getString(R.string.transition_name_circle)),
new Pair<View, String>(view.findViewById(R.id.CONTACT_name),
getString(R.string.transition_name_name)),
new Pair<View, String>(view.findViewById(R.id.CONTACT_phone),
getString(R.string.transition_name_phone))
);
ActivityCompat.startActivity(HomeActivity.this, intent, options.toBundle());
我试图在其构造方法中将 Activity 对象传递给 RVAdapter,但它只导致 NullPointerExceptions。
这是我的 RVAdapter 代码:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.AppVH>{
ArrayList<App> apps;
@Override
public AppVH onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new AppVH(v);
}
@Override
public void onBindViewHolder(AppVH holder, int position) {
holder.name.setText(apps.get(position).getName());
holder.artist.setText(apps.get(position).getArtist());
String p = "";
if(apps.get(position).getPrice()==0.0) p="Free";
else p= "$"+apps.get(position).getPrice()+" "+apps.get(position).getCurrency();
holder.price.setText(p);
Picasso.with(AppListActivity.context).load(apps.get(position).getUrlImLarge()).into(holder.icon);
}
@Override
public int getItemCount() {
return apps.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
RecyclerViewAdapter(ArrayList<App> applications){
this.apps = applications;
}
// Clean all elements of the recycler
public void clear() {
apps.clear();
notifyDataSetChanged();
}
// Add a list of items
public void addAll(ArrayList<App> list) {
apps.addAll(list);
notifyDataSetChanged();
}
public class AppVH extends RecyclerView.ViewHolder implements View.OnClickListener{
CardView cv;
TextView name;
TextView artist;
TextView price;
ImageView icon;
private final Context c;
public AppVH(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cardview);
name = (TextView) itemView.findViewById(R.id.app_name);
artist = (TextView) itemView.findViewById(R.id.app_artist);
price = (TextView) itemView.findViewById(R.id.app_price);
icon = (ImageView) itemView.findViewById(R.id.app_icon);
itemView.setOnClickListener(this);
c = itemView.getContext();
}
@Override
public void onClick(View v) {
final Intent intent;
Log.d("Debugtext","Card with position " + getAdapterPosition() + " was touched.");
intent = new Intent(c, AppDetailActivity.class);
intent.putExtra("app",apps.get(getAdapterPosition()));
c.startActivity(intent);
}
}
}
下面是我如何将适配器添加到 "HomeActivity" 中的 RecyclerView。
RecyclerView rv = (RecyclerView) findViewById(R.id.recycler_view);
rv.setHasFixedSize(true);
GridLayoutManager gridlm = new GridLayoutManager(getApplicationContext(),columns);
rv.setLayoutManager(gridlm);
rvadapter = new RecyclerViewAdapter(apps);
rv.setAdapter(rvadapter);
是否有从适配器中调用 ActivityCompat.startActivity(...) 方法的简便方法?
所以,我做了一件非常简单的事情:我将上下文转换为 activity。哇哦
@Override
public void onClick(View v) {
final Intent intent;
//Opens the AppDetailActivity showing the selected App Card
//Log.d("Debugtext","Card with position " + getAdapterPosition() + " was touched.");
intent = new Intent(c, AppDetailActivity.class);
intent.putExtra("app",apps.get(getAdapterPosition()));
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation((Activity)c, (View)cv, "appcard");
c.startActivity(intent, options.toBundle());
}
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation((Activity) mContext);
注意:mContext 是在回收器适配器构造函数中初始化的。
在我制作的自定义 RecyclerView (RV) 适配器的帮助下,我有一个带有 RecyclerView 的应用程序,里面装满了一些卡片。 然后我尝试按照 this tutorial 添加活动之间的转换。但是,如教程中所示,在 Activity 中创建 Intent 时会调用动画,而我的 OnClick 代码在 RVAdapter 中。这使我无法访问方法
所需的 ActivityIntent intent = new Intent(HomeActivity.this, TargetActivity.class);
intent.putExtra(TargetActivity.ID, Contact.CONTACTS[position].getId());
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
// the context of the activity
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, String>(view.findViewById(R.id.CONTACT_circle),
getString(R.string.transition_name_circle)),
new Pair<View, String>(view.findViewById(R.id.CONTACT_name),
getString(R.string.transition_name_name)),
new Pair<View, String>(view.findViewById(R.id.CONTACT_phone),
getString(R.string.transition_name_phone))
);
ActivityCompat.startActivity(HomeActivity.this, intent, options.toBundle());
我试图在其构造方法中将 Activity 对象传递给 RVAdapter,但它只导致 NullPointerExceptions。
这是我的 RVAdapter 代码:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.AppVH>{
ArrayList<App> apps;
@Override
public AppVH onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new AppVH(v);
}
@Override
public void onBindViewHolder(AppVH holder, int position) {
holder.name.setText(apps.get(position).getName());
holder.artist.setText(apps.get(position).getArtist());
String p = "";
if(apps.get(position).getPrice()==0.0) p="Free";
else p= "$"+apps.get(position).getPrice()+" "+apps.get(position).getCurrency();
holder.price.setText(p);
Picasso.with(AppListActivity.context).load(apps.get(position).getUrlImLarge()).into(holder.icon);
}
@Override
public int getItemCount() {
return apps.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
RecyclerViewAdapter(ArrayList<App> applications){
this.apps = applications;
}
// Clean all elements of the recycler
public void clear() {
apps.clear();
notifyDataSetChanged();
}
// Add a list of items
public void addAll(ArrayList<App> list) {
apps.addAll(list);
notifyDataSetChanged();
}
public class AppVH extends RecyclerView.ViewHolder implements View.OnClickListener{
CardView cv;
TextView name;
TextView artist;
TextView price;
ImageView icon;
private final Context c;
public AppVH(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cardview);
name = (TextView) itemView.findViewById(R.id.app_name);
artist = (TextView) itemView.findViewById(R.id.app_artist);
price = (TextView) itemView.findViewById(R.id.app_price);
icon = (ImageView) itemView.findViewById(R.id.app_icon);
itemView.setOnClickListener(this);
c = itemView.getContext();
}
@Override
public void onClick(View v) {
final Intent intent;
Log.d("Debugtext","Card with position " + getAdapterPosition() + " was touched.");
intent = new Intent(c, AppDetailActivity.class);
intent.putExtra("app",apps.get(getAdapterPosition()));
c.startActivity(intent);
}
}
}
下面是我如何将适配器添加到 "HomeActivity" 中的 RecyclerView。
RecyclerView rv = (RecyclerView) findViewById(R.id.recycler_view);
rv.setHasFixedSize(true);
GridLayoutManager gridlm = new GridLayoutManager(getApplicationContext(),columns);
rv.setLayoutManager(gridlm);
rvadapter = new RecyclerViewAdapter(apps);
rv.setAdapter(rvadapter);
是否有从适配器中调用 ActivityCompat.startActivity(...) 方法的简便方法?
所以,我做了一件非常简单的事情:我将上下文转换为 activity。哇哦
@Override
public void onClick(View v) {
final Intent intent;
//Opens the AppDetailActivity showing the selected App Card
//Log.d("Debugtext","Card with position " + getAdapterPosition() + " was touched.");
intent = new Intent(c, AppDetailActivity.class);
intent.putExtra("app",apps.get(getAdapterPosition()));
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation((Activity)c, (View)cv, "appcard");
c.startActivity(intent, options.toBundle());
}
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation((Activity) mContext);
注意:mContext 是在回收器适配器构造函数中初始化的。