What's my mistake? I want to get an array of strings from resources in the adapter, passing context:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyHolder> { Context context; public RecyclerAdapter (Context context){ this.context = context; } String [] _names = context.getResources().getStringArray(R.array._names); 

Or so:

 public class MyContextWrapper extends ContextWrapper { public MyContextWrapper(Context base) { super(base); } public String[] getCategoryName(){ String[] names = getResources().getStringArray(R.array._names); return names; } 

and in the adapter

 public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyHolder> { Context context; String[] _names = new MyContextWrapper(context).getCategoryName(); 

And in both cases I get NPE in getResources (). GetStringArray (R.array._names);

Strings.xml:

 <resources> <string name="app_name">noyify</string> <string-array name="_names"> <item>Pic1</item> <item>Pic2</item> <item>Pic3</item> <item>Pic4</item> <item>Pic5</item> </string-array> 

Just in case, the example with a wrapper:

 03-15 14:44:38.497 8153-8153/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.vadik.noyify, PID: 8153 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.vadik.noyify/com.example.vadik.noyify.MainActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at com.example.vadik.noyify.MyContextWrapper.getCategoryName(MyContextWrapper.java:16) at com.example.vadik.noyify.RecyclerAdapter.<init>(RecyclerAdapter.java:22) at com.example.vadik.noyify.MainActivity.onCreate(MainActivity.java:43) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) 

    1 answer 1

    Option 1: Do not pass the context, use the one that already exists in RecyclerView. In the holder do:

     public class YourHolder extends RecyclerView.ViewHolder { public Context mContext; public YourHolder(View itemView) { super(itemView); mContext = itemView.getContext(); } } 

    Thus, you can work with the context that is obtained from the view of the holder.

    Update: Option 2: Immediately transfer the prepared array to the adapter's constructor. That's right from the activation.