Error while passing a list from a recyclerview adapter to a viewpager adapter ( 'int java.util.List.size()' on a null object reference )

50 views Asked by At

The app uses a recyclerview adapter to display a list of categories and each category (when clicked on) must open an activity that displays a set of subcategories in the form of cards hence the use of a viewpager adapter.

Here's my error:

07-27 17:55:05.156 1520-1520/com.example.android.dailyarabic E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.dailyarabic, PID: 1520
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.dailyarabic/com.example.android.dailyarabic.VpActivityy}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
        at android.app.ActivityThread.access$1100(ActivityThread.java:221)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7224)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at com.example.android.dailyarabic.ViewPagerAdapter.getCount(ViewPagerAdapter.java:27)
        at androidx.viewpager.widget.ViewPager.setAdapter(ViewPager.java:532)
        at com.example.android.dailyarabic.VpActivityy.onCreate(VpActivityy.java:28)
        at android.app.Activity.performCreate(Activity.java:6876)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7224) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

ViewPagerAdapter activity:

public class ViewPagerAdapter extends PagerAdapter {

    private Context context;
    private List<String> mainCat;
    private LayoutInflater layoutInflater;

    public ViewPagerAdapter(Context context, List<String> mainCat) {
        this.context = context;
        this.mainCat = mainCat;
    }

    @Override
    public int getCount() {
        return mainCat.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view.equals(object);
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {

        layoutInflater = LayoutInflater.from(context);
        View view = layoutInflater.inflate(R.layout.vpitem, container, false);

        TextView textView = view.findViewById(R.id.subCategory);

        textView.setText(mainCat.get(position));
        container.addView(view , 0);

        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View)object);

    }
}

CategoryRecylerViewAdapter :

public class CategoryRecyclerViewAdapter extends RecyclerView.Adapter<CategoryRecyclerViewAdapter.MyViewHolder> {

    private Context mContext;
    private List<Categories> mData;

    public CategoryRecyclerViewAdapter(Context mContext, List<Categories> mData ) {
        this.mContext = mContext;
        this.mData = mData;

    }

    @Override
    public CategoryRecyclerViewAdapter.MyViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
        View view;
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        view = layoutInflater.inflate(R.layout.card_item_layout, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        holder.category_title.setText(mData.get(position).getmTitle());
        holder.category_image.setImageResource(mData.get(position).getmImage());
        holder.category_card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(mContext,VpActivityy.class);

                // passing data to the book activity
                intent.putStringArrayListExtra("Subcategory", (ArrayList<String>) mData.get(position).getSubCategories());

                // start the activity
                mContext.startActivity(intent);

            }
        });
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView category_title;
        ImageView category_image;
        CardView category_card;

        public MyViewHolder(View itemView) {
            super(itemView);
            category_title = itemView.findViewById(R.id.category_title_id);
            category_image = itemView.findViewById(R.id.category_img_id);
            category_card = itemView.findViewById(R.id.cardView_id);
        }
    }
}

VpActivityy (the activity that uses the view pager):

public class VpActivityy extends AppCompatActivity {

    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpager);

        // Receive data
        Intent intent = getIntent();

        ArrayList<String> subcategory = intent.getStringArrayListExtra("Subcategory");

        ViewPagerAdapter adapter = new ViewPagerAdapter(VpActivityy.this, subcategory);

        viewPager = findViewById(R.id.viewPager);
        viewPager.setAdapter(adapter);
        viewPager.setPadding(130,0,130,0);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

}

Note:

VpActivityy.onCreate(VpActivityy.java:28) is this code in the VpActivityy :

viewPager.setAdapter(adapter);

ViewPagerAdapter.getCount(ViewPagerAdapter.java:27) = return mainCat.size();

0

There are 0 answers