0

I know that there are a lot of similarly phrased questions before, but nothing worked for me.

Basically, I have a fragment called HomeFragment. I want to show an image slider in it. Every image has a title and artist on it(TextView).

This is the error I got:

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.viewpager.widget.ViewPager.setAdapter(androidx.viewpager.widget.PagerAdapter)' on a null object reference

Faulty Line:

SliderPagerAdapter adapter = new SliderPagerAdapter(getActivity().getApplicationContext(),lstSlides);
        sliderpager.setAdapter(adapter);

The code works if I use mContext.this with an activity instead of a fragment. I tried using getContext() and getActivity() as I constantly see in other questions but my app crashes immediately nevertheless.

HomeFragment.java

public class HomeFragment extends Fragment {

private List<Slide> lstSlides;
private ViewPager sliderpager;

private static final String TAG = "HomeFragment";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_home,container,false);


    //Slider pictures(inside drawable), song names(title) ve artist names(artist)
    lstSlides = new ArrayList<>();

    lstSlides.add(new Slide(R.drawable.slide1long,"SlideTitle1","SlideArtist1"));
    lstSlides.add(new Slide(R.drawable.slide2long,"SlideTitle2","SlideArtist2"));
    lstSlides.add(new Slide(R.drawable.slide3long,"SlideTitle3","SlideArtist3"));
    lstSlides.add(new Slide(R.drawable.slide4long,"SlideTitle4","SlideArtist4"));
    lstSlides.add(new Slide(R.drawable.slide5long,"SlideTitle5","SlideArtist5"));
    lstSlides.add(new Slide(R.drawable.slide6long,"SlideTitle6","SlideArtist6"));
    lstSlides.add(new Slide(R.drawable.slide7long,"SlideTitle7","SlideArtist7"));
    lstSlides.add(new Slide(R.drawable.slide8long,"SlideTitle8","SlideArtist8"));
    lstSlides.add(new Slide(R.drawable.slide9long,"SlideTitle9","SlideArtist9"));
    lstSlides.add(new Slide(R.drawable.slide10long,"SlideTitle10","SlideArtist10"));

    SliderPagerAdapter adapter = new SliderPagerAdapter(getActivity().getApplicationContext(),lstSlides);
    sliderpager.setAdapter(adapter);

    return view;
}}

SliderPagerAdapter.java

public class SliderPagerAdapter extends PagerAdapter {


    private Context mContext;
    private List <Slide> mList;


    public SliderPagerAdapter(Context mContext, List<Slide> mList) {
        this.mContext=mContext;
        this.mList=mList;


    }

    //Slider information artist,title,pictures etc
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View slideLayout = inflater.inflate(R.layout.slide_item,null);

        ImageView slideImg = slideLayout.findViewById(R.id.slide_img);
        TextView slideText = slideLayout.findViewById((R.id.slide_title));
        TextView slideText2 = slideLayout.findViewById(R.id.slide_artist);



        slideImg.setImageResource(mList.get(position).getImage());
        slideText.setText(mList.get(position).getTitle());
        slideText2.setText(mList.get(position).getArtist());

        container.addView(slideLayout);
        return slideLayout;





    }

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


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


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

Slide.java

public class Slide {



    private int Image;
    private String Title;
    private String Artist;



    public Slide(int image, String title, String artist) {
        Image = image;
        Title = title;
        Artist = artist;

    }


    public int getImage() {
        return Image;
    }

    public void setImage(int image) {
        Image = image;
    }

    public String getTitle() {
        return Title;
    }


    public void setTitle(String title) {
        Title = title;
    }

    public String getArtist() {
        return Artist;
    }

    public void setArtist(String artist) {
        Artist = artist;
    }
}

How can I fix this?

otnemem
  • 13
  • 5
  • 1
    You are not initializing `sliderpager`. – CommonsWare Mar 13 '20 at 20:05
  • 1
    Also, use just `getActivity()` in the `SliderPagerAdapter` constructor – not `getActivity().getApplicationContext()` – to ensure that your layouts are inflated with the appropriate theme. – Mike M. Mar 13 '20 at 20:10
  • @CommonsWare Can you elaborate please, I'm a beginner. How do I do that? – otnemem Mar 13 '20 at 20:13
  • 1
    You are not assigning a value to `sliderpager`. You have the field, and you do not assign it a value. If it is in your `fragment_home` layout resource, you should be calling `findViewById()` to retrieve it from the inflated layout. – CommonsWare Mar 13 '20 at 20:18
  • @CommonsWare The viewpager is not inside the fragment_home, it's inside a layout file called slider_pager.xml. I have added `sliderpager=view.findViewById(R.id.slider_pager);` but the problem continues. – otnemem Mar 13 '20 at 20:38
  • 1
    "The viewpager is not inside the fragment_home, it's inside a layout file called slider_pager.xml" -- you do not appear to be inflating that layout, so I do not think that your fragment will have the `ViewPager`. – CommonsWare Mar 13 '20 at 20:42
  • "I have a __fragment__ called HomeFragment. I want to show an image slider in it." – Then your `` needs to be in the layout you're inflating in `onCreateView()`, whichever layout you want that to be; `fragment_home` or `slider_pager`. – Mike M. Mar 13 '20 at 20:45
  • 1
    I copied my ViewPager from `slider_pager` to `fragment_home` and the problem is solved. Thank you both. – otnemem Mar 13 '20 at 20:57

0 Answers0