i am using a recyclerView
to show my listitems
in the navigation drawer
.I have implemented the onclickListener
but i have been stuck on how to open a different activity
when items are clicked
. All my items do on item click as of now as per the code is to display a toast
with the item position
.
I would appreciate the help.
AdapterClass.java
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.MyViewHolder> { private LayoutInflater inflater; private Context context; List<Information>data= Collections.emptyList(); public AdapterClass(Context context,List<Information>data){ this.context=context; inflater= LayoutInflater.from(context); this.data=data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= inflater.inflate(R.layout.custom_row,parent,false); MyViewHolder holder=new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { Information current=data.get(position); holder.title.setText(current.title); holder.icon.setImageResource(current.iconId); } @Override public int getItemCount() { return data.size(); } class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ TextView title; ImageView icon; public MyViewHolder(View itemView) { super(itemView); title=(TextView)itemView.findViewById(R.id.listText); icon=(ImageView)itemView.findViewById(R.id.listIcon); itemView.setClickable(true); itemView.setOnClickListener(this); } @Override public void onClick(View v) { Toast.makeText(context,"The Item Clicked is: "+getPosition(),Toast.LENGTH_SHORT).show(); } }; }
Log cat error after implementing Konrad's solution 02-27 15:24:52.833: D/AndroidRuntime(1630): --------- beginning of crash 02-27 15:24:52.834: E/AndroidRuntime(1630): FATAL EXCEPTION: main 02-27 15:24:52.834: E/AndroidRuntime(1630): Process: com.snappy.stevekamau.snappy, PID: 1630 02-27 15:24:52.834: E/AndroidRuntime(1630): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snappy.stevekamau.snappy/com.snappy.stevekamau.snappy.YourActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.ActivityThread.access$800(ActivityThread.java:144) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.os.Handler.dispatchMessage(Handler.java:102) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.os.Looper.loop(Looper.java:135) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.ActivityThread.main(ActivityThread.java:5221) 02-27 15:24:52.834: E/AndroidRuntime(1630): at java.lang.reflect.Method.invoke(Native Method) 02-27 15:24:52.834: E/AndroidRuntime(1630): at java.lang.reflect.Method.invoke(Method.java:372) 02-27 15:24:52.834: E/AndroidRuntime(1630): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 02-27 15:24:52.834: E/AndroidRuntime(1630): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-27 15:24:52.834: E/AndroidRuntime(1630): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:95) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:88) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.support.v7.internal.app.ToolbarActionBar.<init>(ToolbarActionBar.java:84) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:175) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92) 02-27 15:24:52.834: E/AndroidRuntime(1630): at com.snappy.stevekamau.snappy.YourActivity.onCreate(YourActivity.java:18) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.Activity.performCreate(Activity.java:5933) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 02-27 15:24:52.834: E/AndroidRuntime(1630): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 02-27 15:24:52.834: E/AndroidRuntime(1630): ... 10 more 02-27 15:24:52.839: W/ActivityManager(464): Force finishing activity com.snappy.stevekamau.snappy/.YourActivity 02-27 15:24:52.841: W/ActivityManager(464): Force finishing activity com.snappy.stevekamau.snappy/.MainActivity
Where do you add the android:onClick attribute to make items in a RecyclerView respond to clicks? In the layout file that displays the RecyclerView, add it to the element. Add it to the layout file for an item in the row.
You can (but don't need to because the ViewHolder
class is not static) create field context as is shown below:
private final Context context; public MyViewHolder(View itemView) { super(itemView); context = itemView.getContext(); ... }
and on your onClick
method just call sth like below:
@Override public void onClick(View v) { final Intent intent; switch (getAdapterPostion()){ case 0: intent = new Intent(context, FirstActivity.class); break; case 1: intent = new Intent(context, SecondActivity.class); break; ... default: intent = new Intent(context, DefaultActivity.class); break; } context.startActivity(intent); }
or
@Override public void onClick(View v) { final Intent intent; if (getAdapterPosition() == sth){ intent = new Intent(context, OneActivity.class); } else if (getPosition() == sth2){ intent = new Intent(context, SecondActivity.class); } else { intent = new Intent(context, DifferentActivity.class); } context.startActivity(intent); }
Simply you can do it easy... You just need to get the context of your activity, here, from your View.
//Create intent getting the context of your View and the class where you want to go Intent intent = new Intent(view.getContext(), YourClass.class); //start the activity from the view/context view.getContext().startActivity(intent); //If you are inside activity, otherwise pass context to this funtion
Remember that you need to modify AndroidManifest.xml and place the activity...
<activity android:name=".YourClass" android:label="Label for your activity"></activity>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With