Search code examples
androidandroid-recyclerviewadapter

Adding the admob bar to the middle of the Recyclerview. IndexOutOfBoundsException


I have a list made with RecyclerView. I can add the ad to the bottom, but I get an error when I want to add it to the middle.

For example, I can't add the ad to line 2. I get error again when I increase getItemCount value by 1 (return movies.size() + 1). What I haven't tried.

My Adapter

public class SeriesActivityAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 private List<Movies> movies;
 private static final int ITEM = 0;
 private static final int BANNER = 1;
 TinyDB tinyDB;
 private Activity context;

public SeriesActivityAdapter(Activity c, List<Movies> movies) {
    this.movies= movies;
    this.context = c;
    tinyDB = new TinyDB(c);
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
   if(viewType==BANNER && !tinyDB.getBoolean("remove_ads")){
        View view = LayoutInflater.from(context).inflate(R.layout.item_ad, parent,false);
        return new MyViewBanner(view);
    }
    else{
        View view = LayoutInflater.from(context).inflate(R.layout.item_series_activity, parent,false);
        return new MyViewHolder(view);
    }

}

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
    if(holder instanceof MyViewHolder){
        final Movies currentMovie = movies.get(position);
        final MyViewHolder myholder = (MyViewHolder) holder;

        Glide.with(context)
                .load(currentMovie.getResim())
                .into(myholder.movieImage);
    }

    else if (holder instanceof MyViewBanner){
        final MyViewBanner myBanner = (MyViewBanner) holder;
        AdRequest adRequest = new AdRequest.Builder().build();
        myBanner.adView.loadAd(adRequest);
    }
}

@Override
public int getItemCount() {
    return movies.size() + 1;
}

@Override
public int getItemViewType(int position) {
    if(position == 2){
            return BANNER;
    }
    return ITEM;
}

}

My Activity

  JsonArrayRequest arrayRequest = new JsonArrayRequest(murl,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray jsonArray) {
                    Log.i("log-",jsonArray.toString());
                    for(int i = 0; i < jsonArray.length(); i++) {
                        try {
                            JSONObject jsonObject = jsonArray.getJSONObject(i);
                            users.add(new Movies(jsonObject.getString("link"),
                                    jsonObject.getString("resim"),
                                    "",jsonObject.getString("tip")));
                        }
                        catch(JSONException e) {
                            Log.i("log-","error"+e.getMessage());
                        }
                    }
                    moviesAdapter.notifyDataSetChanged();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {...
                }
            });
    Volley.newRequestQueue(this).add(arrayRequest);

My Logcat

 Process: com.moktay.izliyoo, PID: 23423
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.get(ArrayList.java:411)
    at com.moktay.izliyoo.list.SeriesActivityAdapter.onBindViewHolder(SeriesActivityAdapter.java:64)

Solution

  • Pass null in Arraylist at the position where you want to show ads in recyler view. Suppose at 2 and 4 position you want ads simplly add null at those position and finally in itemViewType method check for if(arraylist.get(position)==null) { return BANNER }else{ return VIEWTYPE }