Добавление адмоб-бара в середину Recyclerview. IndexOutOfBoundsException - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть список из RecyclerView. Я могу добавить объявление внизу, но получаю ошибку, когда хочу добавить его в середину.

Например, я не могу добавить объявление в строку 2. Я снова получаю сообщение об ошибке, когда увеличиваю значение getItemCount на 1 (return movies.size() + 1). Что я не пробовал.

Мой адаптер

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;
}

}

Моя деятельность

  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);

Мой 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)

1 Ответ

0 голосов
/ 03 ноября 2018

Передайте значение null в Arraylist в той позиции, где вы хотите показывать рекламу в режиме recyler. Предположим, что на 2 и 4 позиции вы хотите, чтобы объявления просто добавляли ноль в эту позицию и, наконец, в методе itemViewType проверьте if(arraylist.get(position)==null) { return BANNER }else{ return VIEWTYPE }

...