Reputation: 89
Hi everyone I'm trying to pass a json object to a second activity to display other informations, but getting an error "expression expected".
My class :
public class Pokemon implements Parcelable {
private String name;
private String type;
private Integer attack;
private Integer defense;
private Integer evolveLevel;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setType(String type) {
this.type = type;
}
public String getType() {
return type;
}
public Integer getattack() { return attack; }
public Integer getdefense() { return defense; }
public Integer getEvolveLevel() { return evolveLevel; }
protected Pokemon(Parcel in) {
name = in.readString();
type = in.readString();
attack = in.readByte() == 0x00 ? null : in.readInt();
defense = in.readByte() == 0x00 ? null : in.readInt();
evolveLevel = in.readByte() == 0x00 ? null : in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(type);
if (attack == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeInt(attack);
}
if (defense == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeInt(defense);
}
if (evolveLevel == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeInt(evolveLevel);
}
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Pokemon> CREATOR = new Parcelable.Creator<Pokemon>() {
@Override
public Pokemon createFromParcel(Parcel in) {
return new Pokemon(in);
}
@Override
public Pokemon[] newArray(int size) {
return new Pokemon[size];
}
};
}
intent :
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Main2Activity.class);
intent.putExtra("Pokemon", Pokemon);
view.getContext().startActivity(pokemon);
}
});
I get an error on this line : intent.putExtra("Pokemon", Pokemon); It underlines Pokemon and says "expression expected"
I can't launch my project, and I don't understand that error, anyone have any ideas ?
[EDIT] Full dataAdapter:
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> implements Filterable {
private ArrayList<Pokemon> mArrayList;
private ArrayList<Pokemon> mFilteredList;
public DataAdapter(ArrayList<Pokemon> arrayList) {
mArrayList = arrayList;
mFilteredList = arrayList;
}
@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, final int i) {
viewHolder.tv_name.setText(mFilteredList.get(i).getName());
viewHolder.tv_version.setText(mFilteredList.get(i).getName());
viewHolder.tv_api_level.setText(mFilteredList.get(i).getType());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Main2Activity.class);
intent.putExtra("Pokemon", mFilteredList.get(i));
intent.putParcelableArrayListExtra("Pokemon_List", mFilteredList);
view.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mFilteredList.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = mArrayList;
} else {
ArrayList<Pokemon> filteredList = new ArrayList<>();
for (Pokemon marraylist : mArrayList) {
if (marraylist.getName().toLowerCase().contains(charString) || marraylist.getType().toLowerCase().contains(charString)) {
filteredList.add(marraylist);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilteredList = (ArrayList<Pokemon>) filterResults.values;
notifyDataSetChanged();
}
};
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView tv_name,tv_version,tv_api_level;
public ViewHolder(View view) {
super(view);
tv_name = (TextView)view.findViewById(R.id.tv_name);
tv_version = (TextView)view.findViewById(R.id.tv_version);
tv_api_level = (TextView)view.findViewById(R.id.tv_api_level);
}
}
}
[EDIT2]
my Main2Activity : public class Main2Activity extends AppCompatActivity {
private TextView attack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Pokemon pokemon = getIntent().getParcelableExtra("Pokemon");
attack.setText(pokemon.getattack().toString());
}
}
Display of name and type in my first activity :
Stack Trace :
/AndroidRuntime: FATAL EXCEPTION: main
Process: fr.clementineferreol.myteamrocket, PID: 3137
java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.clementineferreol.myteamrocket/fr.clementineferreol.myteamrocket.Main2Activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at fr.clementineferreol.myteamrocket.Main2Activity$override.onCreate(Main2Activity.java:17)
at fr.clementineferreol.myteamrocket.Main2Activity$override.access$dispatch(Main2Activity.java)
at fr.clementineferreol.myteamrocket.Main2Activity.onCreate(Main2Activity.java:0)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Upvotes: 0
Views: 363
Reputation: 11642
You should startActivity
by intent and add object to extra. but you are passing pokemon object to startActivity
and adding Pokemon class to extra. Change that it will work fine.
Intent intent = new Intent(view.getContext(), Main2Activity.class);
intent.putExtra("Pokemon", pokemon);
view.getContext().startActivity(intent);
Edited :
You can remove the onclickListener from ViewHolder and You can add it bindView like this, and you are sending Parcelable list it should be send through putParcelableArrayListExtra and putExtra, and if you want to send single element you can get from the list and you can send.
@Override
public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, final int i) {
viewHolder.tv_name.setText(mFilteredList.get(i).getName());
viewHolder.tv_version.setText(mFilteredList.get(i).getName());
viewHolder.tv_api_level.setText(mFilteredList.get(i).getType());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Main2Activity.class);
intent.putExtra("Pokemon", mFilteredList.get(i));
intent.putParcelableArrayListExtra("Pokemon_List", mFilteredList);
view.getContext().startActivity(intent);
}
});
}
Upvotes: 0
Reputation: 4187
startActivity needs intent as input and not pokemon instance. pokemon is the object instance that would like to pass in the second activity which can be retrieved thru the intent.
You can either construct pokemon either in the onclick method or construct pokemon outside onClick method and have it available by declaring it in the MainActivity class.
OPTION1: construct pokemon inside onclick
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// construct pokemon here
Pokemon pokemon = null;
Intent intent = new Intent(view.getContext(), Main2Activity.class);
intent.putExtra("Pokemon", pokemon);
view.getContext().startActivity(intent);
}
});
OPTION2: construct pokemon outside onclick
Pokemon pokemon = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// construct pokemon here
TextView view = (TextView) findViewById(R.id.text);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), Main2Activity.class);
intent.putExtra("Pokemon", pokemon);
view.getContext().startActivity(intent);
}
});
}
Upvotes: 1
Reputation: 2170
You are passing the class name Pokemon with Capital P, i guess you want to pass pokemon with a lowercase p. Which is causing the error you are not passing the object of that class.
Hope this helps.
Upvotes: 0