我有一个带有RecyclerView的应用程序,里面装有一些卡片,借助我自定义的RecyclerView(RV)适配器。 然后我尝试关注this tutorial以便在活动之间添加转换。但是,如教程中所示,在Activity中创建Intent时会调用动画,而我的OnClick代码在RVAdapter中。这使我无法访问方法
所需的活动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);
}
}
}
以下是我如何将适配器添加到我的&#34; HomeActivity&#34;中的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(...)方法?
答案 0 :(得分:7)
所以,我做了一件非常简单的事情:我把上下文作为一个活动。哇。
@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());
}
答案 1 :(得分:0)
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation((Activity) mContext);
注意:mContext在回收器适配器构造函数中初始化。