0

I am trying to implement a recyclerview using a fragment. But I am always getting this error I=and I cant figure it out. Any Help is appreciated.

Here is My code for data I am trying to put in a list:

public class ItemData {
public int BatImageUrl;
public String BatTitle;


public int getBatImageUrl() {
    return BatImageUrl;
}

public void setBatImageUrl(int batImageUrl) {
    BatImageUrl = batImageUrl;
}

public String getBatTitle() {
    return BatTitle;
}

public void setBatTitle(String batTitle) {
    BatTitle = batTitle;
}

public ItemData(int BatImageUrl,String BatTitle){
    this.BatImageUrl=BatImageUrl;
    this.BatTitle=BatTitle;
}
public List<ItemData> itemsData;
public void initializeData(){
    itemsData = new ArrayList<>();
    itemsData.add(new ItemData(R.drawable.batman2,"batman-1"));
    itemsData.add(new ItemData(R.drawable.batman,"batman-2"));
    itemsData.add(new ItemData(R.drawable.batman3,"batman-3"));

}

}

Here is My Adapter Code:

   public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        private List<ItemData> itemsData;

    public MyAdapter(List<ItemData> itemData) {
        this.itemsData = itemData;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View BatmanView = LayoutInflater.from(parent.getContext()).inflate(R.layout.batman_cards,parent,false);

        ViewHolder viewHolder = new ViewHolder(BatmanView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        ItemData id = itemsData.get(position);
        viewHolder.BatImage.setImageResource(id.getBatImageUrl());
        viewHolder.BatTitle.setText(id.getBatTitle());

    }



    public class ViewHolder extends RecyclerView.ViewHolder {

        ImageView BatImage;
        TextView BatTitle;
        CardView cv;
        public ViewHolder(View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.bat_card);
             BatImage = (ImageView) itemView.findViewById(R.id.bat_image);
            BatTitle = (TextView) itemView.findViewById(R.id.bat_title);



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

Here is My fragment code:

  public class BatmanFragment extends Fragment {


    List<ItemData> itemsData;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View BatmanView = inflater.inflate(R.layout.batman_fragment,container,false);

        return BatmanView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        RecyclerView batmanRecyclerview = (RecyclerView) getView().findViewById(R.id.batman_recycler_view);
        batmanRecyclerview.setHasFixedSize(true);
       GridLayoutManager gm = new GridLayoutManager(getActivity(),2);
        gm.setOrientation(GridLayoutManager.VERTICAL);
        batmanRecyclerview.setLayoutManager(gm);


        MyAdapter mAdapter = new MyAdapter(itemsData);
        batmanRecyclerview.setAdapter(mAdapter);
        batmanRecyclerview.setItemAnimator(new DefaultItemAnimator());
    }
}

And Finally My MainActivity:

    public class MainActivity extends AppCompatActivity {

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

        BatmanFragment fragmentS1 = new BatmanFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.your_placeholder, fragmentS1).commit();
    }
}
RoshanPisharody
  • 59
  • 2
  • 10
  • I am not sure if you always want the static data in your list but I have answered it anyway following you approach. – Rohit5k2 Feb 03 '16 at 13:54

3 Answers3

0

Your itemsData is null so it is giving u a NPE change getItemCount()

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

to

@Override
    public int getItemCount() {
if(itemsData==null)
return 0;
        return itemsData.size();
    }

or possible u have missed initializing itemsData

JAAD
  • 12,349
  • 7
  • 36
  • 57
0

You didn't initialized your ArrayList

Change your method like this

public List<ItemData initializeData(){
    itemsData = new ArrayList<>();
    itemsData.add(new ItemData(R.drawable.batman2,"batman-1"));
    itemsData.add(new ItemData(R.drawable.batman,"batman-2"));
    itemsData.add(new ItemData(R.drawable.batman3,"batman-3"));

    return itemsData;
}

add this

itemsData = new ItemData().initializeData();

before

MyAdapter mAdapter = new MyAdapter(itemsData)

Update

Add a default constructor to ItemData class like this.

public ItemData(int BatImageUrl,String BatTitle){

}
Rohit5k2
  • 17,948
  • 8
  • 45
  • 57
0

You have to initiallize itemData = new ArrayList<>(); before this line
MyAdapter mAdapter = new MyAdapter(itemsData);

Sabari
  • 1,963
  • 1
  • 13
  • 10