java .lang.IndexOutOfBoundsException: индекс: 1, размер: 1 ошибка? - PullRequest
1 голос
/ 22 апреля 2020

Мое приложение отображает видеопотоки в моем приложении с помощью recyclerview. Кажется, он начал падать из ниоткуда, и я не могу обернуться, чтобы это исправить.

Мой адаптер:

public class VideosAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {

    private ArrayList<Object> data = new ArrayList<>();
    private Context context;
    private int lastItemPosition = -1;
    private final int VIEW_TYPE_LIST = 0;
    private final int VIEW_TYPE_LOADER = 1;
    private final int VIEW_TYPE_NETWORK_ERROR = 2;
    private final int VIEW_TYPE_AD = 3;
    private boolean isLoading = false;
    private LoadMoreListener loadMoreListener;
    private int visibleThreshold = 2;
    private int lastVisibleItem, totalItemCount;

    private VideoListener videoListener;


    public VideosAdapter(Context context, RecyclerView mRecyclerView, VideoListener videoListener) {
      this.context=context;
      this.videoListener = videoListener;
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LocalMessageManager.getInstance().send(R.id.recyclerview_scroll);
                assert linearLayoutManager != null;
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();

                if ((firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD) % Constants.ADS.LOAD_ADS_AT_POSITION == 0){
                    //
                    int pos = firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD;
                    if(pos > lastItemPosition && data.size()>pos && data.get(pos - 1) != null) {
                        if (!(data.get(pos) instanceof NativeAd)) {
                            videoListener.requestAds(pos);
                        }
                    }
                }

                if (!isLoading && NetworkUtil.hasConnection(context)) {
                    if (totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        if (loadMoreListener != null) {
                            loadMoreListener.onLoadMore();
                        }
                        isLoading = true;
                    }
                }
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        if(data.get(position) instanceof Error)return VIEW_TYPE_NETWORK_ERROR;
        if(data.get(position) == null)return VIEW_TYPE_LOADER;
        if(data.get(position) instanceof NativeAd)return VIEW_TYPE_AD;
        return VIEW_TYPE_LIST;
    }

    public void setData(ArrayList<Object> objectList) {
        this.data.clear();
        this.data.addAll(objectList);
        this.notifyDataSetChanged();
    }

    public void setMoreData(ArrayList<Videos> videos) {
        data.addAll(videos);
        this.notifyDataSetChanged();
    }

    public void setAd(NativeAd ad, int pos) {
        if(!(pos>data.size())) {
            data.add(pos, ad);
            this.notifyItemInserted(pos);
        }
    }


    @Override
    public int getItemCount() {
        return data != null ? data.size() : 0;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        lastItemPosition = position;
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_LIST:
                final VideoViewHolder viewHolder = (VideoViewHolder) holder;
                viewHolder.bindTo((Videos) data.get(position));
                break;
            case VIEW_TYPE_LOADER:
                final ViewLoader viewLoader = (ViewLoader) holder;
                viewLoader.rotateLoading.start();
                break;
            case VIEW_TYPE_NETWORK_ERROR:
                StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                layoutParams.setFullSpan(true);
                holder.itemView.setLayoutParams(layoutParams);

                ViewError viewError = (ViewError) holder;
                if(SharedPrefernces.getUseNightMode()){
                    viewError.img.setColorFilter(App.getContext().getResources().getColor(R.color.white));
                }else{
                    viewError.img.setColorFilter(App.getContext().getResources().getColor(R.color.black));
                }
                break;
            case VIEW_TYPE_AD:
                final AdsViewHolder adsViewHolder = (AdsViewHolder) holder;
                NativeAd nativeAd = (NativeAd)data.get(position);
                adsViewHolder.bind(nativeAd);
                break;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(context);
        switch (i) {
            case VIEW_TYPE_LIST:
                View va;
                if(SharedPrefernces.get_feed_type()==0){
                    va = inflater.inflate(R.layout.large_image_video_list, parent, false);
                }else{
                    va = inflater.inflate(R.layout.video_list, parent, false);
                }
                viewHolder = new VideoViewHolder(va, videoListener);
                break;
            case VIEW_TYPE_LOADER:
                View ld = inflater.inflate(R.layout.loader, parent, false);
                viewHolder = new ViewLoader(ld);
                break;
            case VIEW_TYPE_NETWORK_ERROR:
                View ne = inflater.inflate(R.layout.no_video_stories, parent, false);
                viewHolder = new ViewError(ne);
                break;
            case VIEW_TYPE_AD:
                View ads = inflater.inflate(R.layout.ad_item_large, parent, false);
                viewHolder = new AdsViewHolder(ads);
                break;
        }

        return viewHolder;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.pin:
                break;
            case R.id.share:
                break;
        }
    }

    public class ViewLoader extends RecyclerView.ViewHolder {
        private RotateLoading rotateLoading;

        ViewLoader(View view) {
            super(view);
            rotateLoading = (RotateLoading) view.findViewById(R.id.rotateloading);
        }
    }

    public class ViewError extends RecyclerView.ViewHolder {
        private ImageView img;

        ViewError(View view) {
            super(view);
            img = view.findViewById(R.id.img);
        }
    }

    public void setLoaded(){
        data.remove(data.size()-1);
        this.notifyItemRemoved(data.size()-1);
        isLoading = false;
    }

    public void setLoadMoreListener(LoadMoreListener loadMoreListener) {
        this.loadMoreListener = loadMoreListener;
    }

    public void setLoader(){
        data.add(null);
        this.notifyItemInserted(data.size()-1);
    }
}

Код из фрагмента, который устанавливает этот адаптер и также выдает ошибку:

        recyclerView = (RecyclerView) layout.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));
        adapter = new VideosAdapter(getActivity(),recyclerView,this);

        adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
            if(data.size()> 0 && data.get(1) instanceof Videos){
                adapter.setLoader();
                loadMoreFeeds();
            }
        }));
        recyclerView.setAdapter(adapter);

Журнал ошибок:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)

Я попытался исправить несколько ошибок из других ответов SOF, но не смог понять, что пошло не так с моим кодом, учитывая, что он работает хорошо, и вдруг кажется, что начал сбой. Я удалил заголовок в адаптере, если это имеет значение.

1 Ответ

2 голосов
/ 22 апреля 2020

Ваша проблема в этом фрагменте кода:

adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
        if(data.size()> 0 && data.get(1) instanceof Videos){
            adapter.setLoader();
            loadMoreFeeds();
        }
    }));

вы проверяете, больше ли length вашего массива, чем 0, но это означает, что также может быть только один элемент , Поэтому вы должны изменить эту строку на:

 if(data.size() > 0 && data.get(0) instanceof Videos)

или на:

 if(data.size() > 1 && data.get(1) instanceof Videos)

Помните, что количество элементов в массиве начинается с 0. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...